最小起订量的链接方法
Chaining methods with 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
is an extension method, which Moq cannot mock。
我正在尝试使用 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
is an extension method, which Moq cannot mock。