[英]Unit Test Failing with Moq and xUnit - InvalidOperationException
Im setting up a simple integration test using Moq and Xunit as per this article: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing?view=aspnetcore-3.1我根据这篇文章使用 Moq 和 Xunit 设置了一个简单的集成测试: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing?view=aspnetcore-3.1
When I run the test I get the following error:当我运行测试时,我收到以下错误:
System.InvalidOperationException : Can't load type x.IntegrationTests.Startup in 'x.IntegrationTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
HomeControllerTests.cs HomeControllerTests.cs
public class HomeControllerTests
{
[Fact]
public void Test()
{
Assert.True(true);
}
}
csproj csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="Moq" Version="4.15.2" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="1.3.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\x\x.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="xunit.runner.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
I found moving my Moq'd services to test fixtures worked.我发现将我的 Moq'd 服务转移到测试装置是有效的。 Hopefully the following loose example may give you something to work with...
希望下面的松散示例可以为您提供一些帮助......
Fixture:夹具:
public class MyTestServicesFixture
{
public MyTestServicesFixture()
{
var services = new ServiceCollection();
...
var mockDataService = new Mock<IPhotoCollectionDataService>();
mockDataService.Setup(s => s.GetPhotoAsync((int)TestPhotoIds.TestJpegImage))
.ReturnsAsync(() =>
{
return BuildTestPhotoEntity(TestPhotoIds.TestJpegImage, "example.jpg");
}
);
mockDataService.Setup(s => s.GetPhotoAsync((int)TestPhotoIds.TestHeifStillImage))
.ReturnsAsync(() =>
{
return BuildTestPhotoEntity(TestPhotoIds.TestHeifStillImage, "example.heic");
}
);
services.AddScoped(sp => mockDataService.Object);
...
ServiceProvider = services.BuildServiceProvider();
}
public ServiceProvider ServiceProvider { get; private set; }
private Photo BuildTestPhotoEntity(TestPhotoIds testPhotoId, string fileName)
{
return new Photo
{
Id = (int)testPhotoId,
PhotoCollectionId = TestSettings.TEST_PHOTO_COLLECTION_ID,
OriginalFileName = fileName,
UploadFileName = fileName,
Description = $"Test description for {fileName}"
};
}
}
Tests using fixture:使用夹具进行测试:
public class PhotoCollectionServiceTests : IClassFixture<MyTestServicesFixture>
{
protected readonly IPhotoCollectionDataService _photoCollectionDataService;
public PhotoCollectionServiceTests(MyTestServicesFixture testsFixture)
{
var services = testsFixture.ServiceProvider;
_photoCollectionDataService = services.GetRequiredService<IPhotoCollectionDataService>();
}
[Theory]
[InlineData(TestPhotoIds.TestJpegImage)]
[InlineData(TestPhotoIds.TestHeifStillImage)]
public async Task ProcessPhotoUploadTest(TestPhotoIds testPhotoId)
{
// Arrange
...
// Act
var result = _photoCollectionDataService.DoSomething(testPhotoId);
// Assert
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.