gpt4 book ai didi

.net - 使用 Moq 使用 Expression> 参数的模拟方法

转载 作者:行者123 更新时间:2023-12-05 00:40:22 26 4
gpt4 key购买 nike

我想使用 Moq 来模拟这个界面

IInterfaceToBeMocked {
IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter);
}

我正在考虑做类似的事情
_mock.Setup(method => method.SearchDudeByFilter( x=> x.DudeId.Equals(10) && X.Ride.Equals("Harley"))). Returns(_dudes);// _dudes is an in-memory list of dudes.

当我尝试在需要此模拟的地方调试单元测试时,它说“不允许表达式”指向 lambda。如果它有任何区别,我将使用 xUnit 作为测试框架。

最佳答案

以下对我来说很好用 Moq 4.0 Beta :

public class Dude 
{
public int DudeId { get; set; }
public string Ride { get; set; }
}

public interface IInterfaceToBeMocked
{
IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter);
}

和单元测试:
[TestMethod]
public void TestDudes()
{
// arrange
var expectedDudes = new[]
{
new Dude(), new Dude()
};
var mock = new Mock<IInterfaceToBeMocked>();
mock.Setup(method => method.SearchDudeByFilter(
x => x.DudeId.Equals(10) && x.Ride.Equals("Harley"))
).Returns(expectedDudes);

// act
// Remark: In a real unit test this call will be made implicitly
// by the object under test that depends on the interface
var actualDudes = mock.Object.SearchDudeByFilter(
x => x.DudeId.Equals(10) && x.Ride.Equals("Harley")
);

// assert
Assert.AreEqual(actualDudes, expectedDudes);
}

现在,如果您将某些内容更改为实际方法调用的参数,则测试将不再通过,因为仅当参数相同时,模拟方法才会返回预期结果:
var actualDudes = mock.Object.SearchDudeByFilter(
x => x.DudeId.Equals(20) && x.Ride.Equals("Honda")
);

备注:采用 lambda 表达式的模拟方法是一项新功能,在我们需要使用 It.Is<SomeType> 的以前版本中不可用。和 It.IsAny<SomeType>参数约束。

关于.net - 使用 Moq 使用 Expression<Func<T,bool>> 参数的模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com