簡體   English   中英

使用TestServer處理錯誤情況

[英]Using TestServer for error scenarios

我試圖使用TestServer來驗證我的應用程序在出現異常時的行為。 例如,在此示例中,我有一個控制器將調用數據庫,但是在我的測試中,我故意設置repository以引發異常。

[Route("api/[controller]")]
public class ValuesController : Controller
{
    private readonly IRepository _repo;

    public ValuesController(IRepository repo)
    {
        _repo = repo;
    }

    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        this._repo.Execute();
        return new string[] { "value1", "value2" };
    }
}

我期望將返回內部服務器錯誤。 盡管這對於F5並運行應用程序來說是可行的,但我還是希望通過TestServer做到這一點。

    [Fact]
    public void Test1()
    {
        using (var client = new TestServer(new WebHostBuilder()
            .UseStartup<TestStartup>())
            .CreateClient())
        {
            var result = client.GetAsync("api/values").Result;
            Assert.Equal(result.StatusCode, HttpStatusCode.InternalServerError);
        }
    }

    public class TestStartup : Startup
    {
        protected override void ConfigureDependencies(IServiceCollection services)
        {
            services.AddSingleton<IRepository, FailingRepo>();
        }
    }
}

public class FailingRepo : IRepository
{
    public void Execute()
    {
        throw new NotImplementedException();
    }
}

相反,我得到的是測試失敗:

System.AggregateException:發生一個或多個錯誤。 (該方法或操作未實現。)

如果我要在管道開始時插入一些自定義中間件,則可以使它工作,類似於以下內容:

public class ErrorMiddleware
{
    private RequestDelegate next;
    private readonly ILogger logger;

    public ErrorMiddleware(RequestDelegate next, ILogger logger)
    {
        this.next = next;
        this.logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await this.next.Invoke(context);
        }
        catch (Exception e)
        {
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        }
    }
}

我記得可以通過完整.NET框架中可用的Owin Test Server來執行此操作。 任何想法如何去做呢?

您可以使用WebApplicationFactory

public class BasicTests 
    : IClassFixture<WebApplicationFactory<RazorPagesProject.Startup>>
{
    private readonly WebApplicationFactory<RazorPagesProject.Startup> _factory;

    public BasicTests(WebApplicationFactory<RazorPagesProject.Startup> factory)
    {
        _factory = factory;
    }

而不是通用類型的RazorPagesProject.Startup使用您自己的項目進行測試。 工廠將為您提供訪問所需路線的選項,並測試它們是否如您所願地進行測試:

// Arrange
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("api/Values");
//
response.EnsureSuccessStatusCode(); // Status Code 200-299

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM