测试使用DBContext的服务的正确方法?

时间:2018-12-26 20:27:38

标签: c# entity-framework unit-testing integration-testing moq

我使用了如下测试。我有一个用于初始化整个dbcontext的大方法(它比下面粘贴的大,它是相似的,但是对于MoQ验证,每个dbset具有更多模型和访问权限),例如假db。接下来,我将其注入服务并调用使用它的方法。

使用单元测试对服务(使用dbcontext进行测试)是否正确?如果不正确,测试这种服务的好方法是什么(也许只编写连接到真实数据库的测试)?

我的测试:

[Test]
public void ExampleServiceTest()
{
    var mock = InitializeMockContext();

    var service = new TagsService(mock.Object);
    var result = service.GetTags(2);
    var expectection = 2;

    Assert.AreEqual(expectection, result.Id);
}

创建模拟DBContext的方法:

public Mock<MyDBContext> InitializeMockContext()
{
    var mock = new Mock<MyDBContext>();
    var mockDataTags = new List<Tags> {
        new Tags { Id = 1, Count = 3 },
        new Tags { Id = 2, Count = 2} }.AsQueryable();
    var mockSet = new Mock<DbSet<Tags>>();
    mockSet.As<IQueryable<Tags>>().Setup(m => m.Provider).Returns(mockDataTags.Provider);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.Expression).Returns(mockDataTags.Expression);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.ElementType).Returns(mockDataTags.ElementType);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.GetEnumerator()).Returns(mockDataTags.GetEnumerator());
    mock.Setup(x => x.Tags).Returns(mockSet.Object);
    //I have more than just one model here
    return mock;
    }

MyService:

public class TagsService
{
    private readonly MyDBContext _ctx;
    public TagsService(MyDBContext ctx)
    {
        _ctx = ctx;
    }
    public Tags GetTags(int count)
    {
        using (var db = _ctx)
        {
            return db.Tags.First(x => x.Count == count);
        }
    }
}

0 个答案:

没有答案