EF。模拟ICollection

时间:2014-02-18 11:24:48

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

我有班级模特角色:

public partial class Role
{
    public Role()
    {
        this.Users = new HashSet<User>();
    }

    public int Id { get; set; }
    public string RoleName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

而UnitTesting我需要嘲笑它。 所以我有代码:

public class RoleControllerTest
{
    private IUnitOfWork fakeRepo;
    [TestInitialize]
    public void Initialize()
    {
        Mock<IUnitOfWork> mock = new Mock<IUnitOfWork>();
        mock.Setup(m => m.roleRepository.Get(null)).Returns(new[]{
           new Role{Id=1, RoleName="Admin",MissingArgument},
           new Role{Id=2,RoleName="User",MissingArgument}
        });
    }
}

我不知道如何模拟

public virtual ICollection<User> Users { get; set; }

尝试null但是这个alsa返回错误。 你能告诉我什么变量以及我应该用什么类型代替MissingArgument

1 个答案:

答案 0 :(得分:2)

我假设Moq - Users只是您要为其生成假数据的Role类的属性,因此您可以继续使用对象初始化程序语法进行初始化它在你的模拟Get实现的Returns中,如下所示:

    Mock<IUnitOfWork> mock = new Mock<IUnitOfWork>();
    mock.Setup(m => m.roleRepository.Get(It.IsAny<int>()))
        .Returns(new[]{
           new Role
           {
             Id=1, 
             RoleName="Admin", 
             Users = new List<User>
              {
                 new User 
                 { 
                   // Set SomeUserProperties Here 
                 },
                 // Add another User here if needed
              }},
           new Role
           {
               Id=2,
               RoleName="User" 
               // Add users here
           }
          }
         );

如果您发现自己需要在多个单元测试中返回相同的假数据,则可以创建一组常见的预制static readonly个对象,或者使用object mother factory表示各种users和{ {1}},这会干掉您的代码。