模拟存储库返回列表

时间:2011-11-30 18:00:59

标签: c# unit-testing moq

此时我已经在树林里迷失了方向,我一直在做着同样的改变,认为intellisense只是隐藏了一些东西。

我正在尝试创建一个模拟的repo来测试添加(和查询)单个类型和列表。单个回购正如:

public Mock<IBaseRepository<DNS_Entity>> RepositoryFakeObject()
    {
        var _dns = new List<DNS_Entity>();
        var mock = new Mock<IBaseRepository<DNS_Entity>>();

        mock.Setup(x => x.Add(It.IsAny<DNS_Entity>()))
            .Callback((DNS_Entity e) => _dns.Add(e));

        mock.Setup(x => x.SelectALL()).Returns(_dns.AsQueryable());
        return mock;
    }

然而,我尝试为列表做类似的事情却无法正常工作。特别是安装程序中的返回对我嘲笑。

我现在所拥有的是:

 public Mock<IBaseRepository<List<DNS_Entity>>> RepositoryFakeList() // Mock<IBaseRepository<List<DNS_Entity>>>
    {
        var _dns = new List<DNS_Entity>();
        var mock = new Mock<IBaseRepository<List<DNS_Entity>>>();

        mock.Setup(x => x.Add(It.IsAny<List<DNS_Entity>>()))
            .Callback((List<DNS_Entity> le) => _dns.Add(le.Select(e => e) as DNS_Entity));

       // mock.Setup(x => x.SelectALL()).Returns((IQueryable<List<DNS_Entity>>) (_dns));

        mock.Setup(x => x.SelectALL()).Returns(_dns.AsQueryable());
        return mock;

    }

最终,我想对添加测试做一些事情,如:

[Test]
    public void AddNewList()
    {
        var mock = RepositoryFakeList();

        var lst = new List<DNS_Entity>
                      {
                          new DNS_Entity {FirstName = "added", LastName = "From Test"},
                          new DNS_Entity {FirstName = "added2", LastName = "From Test2"}
                      };

        mock.Object.Add(lst);

        Assert.IsTrue(mock.Object.SelectALL().Count() == 2);
    }

我在这里缺少什么?我之前从未嘲笑这样的回购,所以我可能违反了一些基本原则,如果有的话请告诉我。

感谢。

1 个答案:

答案 0 :(得分:4)

我认为问题在于这一行

.Callback((List<DNS_Entity> le) => _dns.Add(le.Select(e => e) as DNS_Entity));

当您使用Select时,它会返回IEnumerable<DNS_ENTITY>,但您将其投放到DNS_ENTITY,这将导致null

尝试...

.Callback((List<DNS_Entity> le) => _dns.AddRange(le));
相关问题