如何对使用Entity Framework创建对象的存储库层方法进行单元测试?

时间:2014-05-01 15:43:01

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

我的应用程序中有一个类似于以下内容的存储库:

public interface IUserRepository
{
    void CreateUser(User user);
    void Save();
}

public class UserRepository : IUserRepository
{
    public void CreateUser(User user)
    {
        // UsersContext is injected through Unity
        if(user != null)
            this.UsersContext.Users.Add(user);
    }

    public void Save()
    {
        this.UsersContext.SaveChanges();
    }
}

我正在使用实体框架关于单元测试的this MSDN文章。 我的测试方法如下所示:

[TestMethod]
public void CreateUser_Test()
{
    var mockSet = new Mock<DbSet<User>>();

    var mockContext = new Mock<UsersContext>();
    mockContext.Setup(m => m.Users).Returns(mockSet.Object);

    var repo = new UserRepository(mockContext.Object);
    repo.CreateUser(new User {Name = "Sample User", Age = 23});
    repo.Save();

    // Assert fails, nothing is added to the mocked DbSet.
    Assert.AreEqual(1, mockSet.Object.Users.Count());
}

我无法测试我尝试创建的对象是否真的被添加到模拟的DbSet中。 MSDN文章也没有帮助,它只测试方法被调用,并且不测试对象是否被添加到模拟的DbSet。有什么方法可以验证我创建的对象是否已添加到模拟的DbSet

1 个答案:

答案 0 :(得分:1)

您正在测试非查询方案(http://msdn.microsoft.com/en-us/library/dn314429.aspx#nonQuery)。 Moq为此目的使用Verify方法:

 mockSet.Verify(m => m.Add(It.IsAny<User>()), Times.Once());
 mockContext.Verify(m => m.SaveChanges(), Times.Once());

顺便说一下,您可能不希望在您的存储库中使用Save()方法。我建议调查工作单元模式,这将允许您通过确保它们共享相同的上下文来协调不同存储库之间的更改。