메모리 데이터베이스를 사용하여 ASP.NET 5에서 Entity Framework 7 테스트

asp.net-core entity-framework-core testing

문제

나는 콘트롤을 콘트롤러에 삽입하고 데이터베이스 컨텍스트의 "in memory"버전의 데이터를 수정하는 콘텍스트를 얻고 싶다.

컨트롤러가 이렇게 보입니다.

[Route("api/[controller]")]
public class TestController : Controller
{
    private readonly TestContext _testContext;
    public TestController(TestContext testContext)
    {
        _testContext = testContext;
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new { _testContext.Users });
    }
}

시험은 이렇게 보입니다.

public class SiteTests
{
    [Fact]
    public async Task GetIt()
    {
        var server = TestServer.Create(app => { app.UseMvc(); }, services =>
        {
            services.AddMvc();

            services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<TestContext>(options => options.UseInMemoryDatabase());

            services.AddScoped<TestContext, TestContext>();
        });

        var client = server.CreateClient();

        var response = await client.GetAsync("http://localhost/api/test");
        var content = await response.Content.ReadAsStringAsync();

        Assert.True(response.IsSuccessStatusCode);
    }
}

클라이언트가 요청을 받고 어떤 데이터가 데이터베이스 컨텍스트에서 되돌아 올지를 수정하기 전에 어떻게 든 컨텍스트를 보려고합니다.

나는 GitHub에서 테스트 프로젝트 를 가지고있다.

인기 답변

.NET 코어를 목표로한다면, 자동 mocking 프레임 워크를 사용할 수 없습니다.

당신이 할 수있는 최선의 방법은 TestContext 모든 메소드를 가상으로 만든 다음 단위 테스트에서 그것을 확장하는 것입니다.

public class IntegrationTestContext : TestContext
{
    // override methods here
}

그런 다음

var context = new IntegrationTestContext();
services.AddInstance<TestContext>(context);

IntegrationTestContext 에서 원하는 추가 정보를 캡처하여 테스트 내에서 액세스 할 수도 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.