c# - 最小起订量的链接方法

标签 c# unit-testing mocking moq

我正在尝试使用 Moq 模拟和设置链式方法。

这是我试图模拟的方法:

TeamMember teamMember = _unitOfWork
    .TeamMembers
    .Query()
    .ToList()
    .Where(t => t.AssociationCode.ToString() == code 
        && Crypto.EncryptStringAES(t.Id.ToString(), sharedSecret) == hash)
    .SingleOrDefault();

这是我试图模拟它的地方:

var unitOfWorkMock = new Mock<IUnitOfWork>();
var iQueryableMock = new Mock<IQueryable<TeamMember>>();
var iToListMock = new Mock<List<TeamMember>>();
var whereMock = new Mock<IList<TeamMember>>();
var singleMock = new Mock<IEnumerable<TeamMember>>();

unitOfWorkMock
    .Setup(u => u.TeamMembers
        .Query())
        .Returns(iQueryableMock.Object);

iQueryableMock
    .Setup(i => i.ToList())
        .Returns(iToListMock.Object); //This line throws the error

whereMock
    .Setup(w =>
            w.Where(It.IsAny<Func<TeamMember, bool>>()))
        .Returns(singleMock.Object);

singleMock
    .Setup(s =>
            s.SingleOrDefault())
        .Returns(new TeamMember()
        {
            Email = "Test@TeamMember.com"
        });

当我运行这个测试时,它给我这个错误:

Expression references a method that does not belong to the mocked object: i => i.ToList<TeamMember>()

我看过this question已经尝试做类似的事情,但我一定遗漏了一些东西。

我是新手,所以如果有人能帮助我,我将不胜感激。

最佳答案

你的方法链模拟看起来不错,但你的问题是 ToList是一个 extension method ,这Moq cannot mock .

关于c# - 最小起订量的链接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31732059/

相关文章:

php - 为什么模拟的 returnValue 在 phpunit 的拆卸中不起作用?

mocking - rspec 模拟 : verify expectations in it "should" methods?

c# - 如何在 App.Config 中设置相对路径?

c# - BinaryReader - 读取单个 "BIT "?

unit-testing - maven project junit test all fail 因为无法编译源代码

unit-testing - 关于如何编写对重构友好的单元 TDD 测试的技巧

c# - 模拟一个方法返回 true 仍然返回 false

c# - 去除图像周围的黑色边框

c# - 绑定(bind)集合的子集

javascript - 使用 React、Enzyme、Jest 测试嵌套 div 中是否存在特定链接