Cal*_*lin 9 c# asp.net asp.net-core-mvc asp.net-core
以下代码按预期工作,与asp站点上的示例非常相似:
public abstract class BaseResourceTests : IDisposable
{
private readonly TestServer _server;
public HttpClient HttpClient { get; }
protected BaseResourceTests(string resourceVersion)
{
var hostBulider = new WebHostBuilder()
.UseStartup<Startup>();
_server = new TestServer(hostBulider);
HttpClient = _server.CreateClient();
HttpClient.BaseAddress = new Uri("http://localhost:5000");
}
public virtual void Dispose()
{
HttpClient.Dispose();
_server.Dispose();
}
}
public class EndpointTests : BaseResourceTests
{
public EndpointTests()
: base(Resource.VersionHeader)
{
}
[Fact]
public async Task Post_BodyHasValidDto_ReturnsCreated()
{
var dto = new Dto { Name = "someDto" };
var response = await HttpClient.PostAsJsonAsync("/api/someEndpoint", dto);
Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.Created);
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试很好,它可以很好地达到控制器中的动作.但是在现实生活中,测试稍微复杂一点,我需要添加一些服务和自定义测试配置.
为了做到这一点,我创建了一个继承自我的原始项目Startup类的TestStartup:
public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env) : base(env)
{
}
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
}
public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
base.Configure(app, env, loggerFactory);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只委托给基类,所以现在我更改构建器以使用我的TestStartup代码:
protected BaseResourceTests(string resourceVersion)
{
var hostBulider = new WebHostBuilder()
.UseStartup<TestStartup>();
_server = new TestServer(hostBulider);
HttpClient = _server.CreateClient();
HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(resourceVersion));
HttpClient.BaseAddress = new Uri("http://localhost:5000");
}
Run Code Online (Sandbox Code Playgroud)
现在,测试失败了Http NotFound异常.调试时,结果是控制器中的操作不再受测试代码的影响.
我的猜测是,如果启动文件是与控制器不同的程序集,mvc不会检测到路由,我该如何解决这个问题呢?
我在这里写了一篇关于使用 xUnit 进行此类集成测试的文章:http://andrewlock.net/introduction-to-integration-testing-with-xunit-and-testserver-in-asp-net-core。
我采取的方法是创建一个Fixture可以注入到测试类中的类。
夹具:
public class TestFixture<TStartup> : IDisposable where TStartup : class
{
private readonly TestServer _server;
public TestFixture()
{
var builder = new WebHostBuilder().UseStartup<TStartup>();
_server = new TestServer(builder);
Client = _server.CreateClient();
Client.BaseAddress = new Uri("http://localhost:5000");
}
public HttpClient Client { get; }
public void Dispose()
{
Client.Dispose();
_server.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
然后测试类实现IClassFixture<TestFixture<TStartup>>:
public class MiddlewareIntegrationTests : IClassFixture<TestFixture<SystemUnderTest.Startup>>
{
public MiddlewareIntegrationTests(TestFixture<SystemUnderTest.Startup> fixture)
{
Client = fixture.Client;
}
public HttpClient Client { get; }
[Fact]
public async Task AllMethods_RemovesServerHeader(string method)
{
// Arrange
var request = new HttpRequestMessage(new HttpMethod("GET"), "/");
// Act
var response = await Client.SendAsync(request);
//assert etc
}
}
Run Code Online (Sandbox Code Playgroud)
为了使用 MVC,并确保您的视图可以被发现,您应该更新您的WebHostBuilder内容路径:
var path = PlatformServices.Default.Application.ApplicationBasePath;
var setDir = Path.GetFullPath(Path.Combine(path, <projectpathdirectory> ));
var builder = new WebHostBuilder()
.UseContentRoot(setDir)
.UseStartup<TStartup>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |