c# - 模拟存储库返回列表

标签 c# unit-testing moq

此时我已经迷失在树林中,我不断地进行相同的更改,并认为智能感知只是向我隐藏了一些东西。

我正在尝试创建一个模拟存储库来测试添加(和查询)单一类型和列表。单个存储库的工作原理如下:

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;
    }

但是,我尝试对列表执行类似的操作却不起作用。具体来说,设置中的 Returns 正在 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);
    }

我在这里缺少什么?我以前从未 mock 过这样的存储库,所以我可能违反了一些基本原则,如果是这样,请告诉我。

谢谢。

最佳答案

我认为问题出在这一行

.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));

关于c# - 模拟存储库返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330654/

相关文章:

c# - 如何关闭窗口窗体并将控制转移到另一个窗体?

c# - 将select查询映射到一个对象会在linq中出错

c# - Visual Studio 2015 Intellitest 不适用于 64 位项目

php - 使用 PHPUnit 在 Laravel Controller 内部进行单元测试 Guzzle

c# - 是否需要调用在 Mock 对象上设置一个方法,我们要验证它是使用 Moq 调用的?

C# 将 Action 转换为 Action <bool>

c# - 安排代表电话

perl - 证明命令在 arisdottle 之后不传递参数

c# - Moq 单元测试用例 - 带有 WebAPI 的 ASP.NET MVC

c# - 如何在 xunit 中使用最小起订量测试返回 IEnumerable<model> 的异步任务<IActionResult>?