Mocked存储库不会填充

时间:2014-09-10 10:20:15

标签: c# unit-testing repository moq

我使用假类进行了初始单元测试

var dbContext = new FakeMyDbContext
        {
            Users = { new IdentityUser {
                               Id="94ccfbae-8567-405e-8e2e-70a038cdde40" }
            },
        };

var repository = new MyRepository<IdentityUser>(dbContext);

当我运行它时,我在存储库中有1个用户,很好。但是我想要使用Moq,所以我尝试了这个

var user = new Mock<IdentityUser>();
user.Setup(x => x.Id).Returns("94ccfbae-8567-405e-8e2e-70a038cdde40");

var users = new Mock<IDbSet<IdentityUser>>();
users.Setup(x => x.Add(user.Object));

var dbContext = new Mock<MyDbContext<IdentityUser>>();
dbContext.Setup(x => x.Users).Returns(users.Object);

var repository = new MyRepository<IdentityUser>(dbContext.Object);

但在这种情况下,存储库是空的。我错过了什么?感谢。

更新

稍微改动以获得已接受的工作答案。 DbSet不能直接访问,因此创建了一个FakeDbSet

public class FakeDbSet<T> : IDbSet<T> where T : class

并使用

var user = new IdentityUser { Id = "94ccfbae-8567-405e-8e2e-70a038cdde40" };
IDbSet<IdentityUser> users = new FakeDbSet<IdentityUser> { user };

1 个答案:

答案 0 :(得分:1)

我认为users-mock不提供任何用户。你模拟IDbSet<IdentityUser>的Add()方法,但它实际上没有添加任何东西,因此没有用户。您需要设置一些其他方法来提供用户或根本不模拟用户,如下所示:

IDbSet<IdentityUser>  users = new DbSet<IdentityUser>
{
    new IdentityUser { Id = "94ccfbae-8567-405e-8e2e-70a038cdde40" }
};

var dbContext = new Mock<MyDbContext<IdentityUser>>();
dbContext.Setup(x => x.Users).Returns(() => users);

var repository = new MyRepository<IdentityUser>(dbContext.Object);