C# Moq lambda表达式的行为异常
我有一个使用MOQ的单元测试,它的表现出乎意料。我希望IsAuthorizedAsync方法总是返回true,但它返回false。下面是将IsAuthorizedAsync方法添加到我的模拟对象的代码的简化版本C# Moq lambda表达式的行为异常,c#,unit-testing,lambda,mocking,moq,C#,Unit Testing,Lambda,Mocking,Moq,我有一个使用MOQ的单元测试,它的表现出乎意料。我希望IsAuthorizedAsync方法总是返回true,但它返回false。下面是将IsAuthorizedAsync方法添加到我的模拟对象的代码的简化版本 public static IAuthenticationInterface GetAuthentication() { var mock = new Mock<IAuthenticationInterface>(); mock.S
public static IAuthenticationInterface GetAuthentication()
{
var mock = new Mock<IAuthenticationInterface>();
mock.Setup(e => e.IsAuthorizedAsync(It.IsIn<string>(), It.IsAny<MyEvent>())).Returns(System.Threading.Tasks.Task.FromResult(true)).Verifiable();
// return the mock object
return mock.Object;
}
就像我说的,当我觉得它应该总是返回真的时候,它返回的是假。我有没有办法进入lambda表达式代码?或者,当我调用this.mockObject.IsAuthorizedAsync时,是否可以查看实际使用的lambda表达式?我怀疑不是我想的那样
-Eric根据@tzachs的评论,请注意
It.IsIn
matcher获取匹配值列表(实例中的字符串)It.IsIn()
带有空的参数
或IEnumerable
将永远不会匹配任何内容,因为它是通过实现的。Contains
:
public static TValue IsIn<TValue>(IEnumerable<TValue> items)
{
return Match.Create<TValue>((Predicate<TValue>)
(value => Enumerable.Contains<TValue>(items, value)),
(Expression<Func<TValue>>) (() => It.IsIn<TValue>(items)));
}
(是的,我知道我只是在这里测试模拟:)根据@tzachs的评论,请注意,
It.IsIn
matcher获取匹配值列表(实例中的字符串)It.IsIn()
带有空的参数
或IEnumerable
将永远不会匹配任何内容,因为它是通过实现的。Contains
:
public static TValue IsIn<TValue>(IEnumerable<TValue> items)
{
return Match.Create<TValue>((Predicate<TValue>)
(value => Enumerable.Contains<TValue>(items, value)),
(Expression<Func<TValue>>) (() => It.IsIn<TValue>(items)));
}
(是的,我知道我只是在这里测试模拟:)使用visual studio 2013,我能够进入lambda表达式。在表达式上设置断点后,只需使用步骤(f11)。这在我看来很好,并且在我设置类似的东西时起作用,因此我认为设置不太正确或正在进行其他操作-myEvent的类型是什么?它肯定是MyEvent吗?你是在模仿接口还是类?如果它是一个类,那么第一个代码段中的方法是否标记为virtual?e是一个接口。在第二个代码段中,myEvent是myEvent,它返回true。您可能有输入错误吗
It.IsIn()
应该是It.IsAny()
也许吧?借助visual studio 2013,我可以逐步使用lambda表达式。在表达式上设置断点后,只需使用步骤(f11)。这在我看来很好,并且在我设置类似的东西时起作用,因此我认为设置不太正确或正在进行其他操作-myEvent的类型是什么?它肯定是MyEvent吗?你是在模仿接口还是类?如果它是一个类,那么第一个代码段中的方法是否标记为virtual?e是一个接口。在第二个代码段中,myEvent是myEvent,它返回true。您可能有输入错误吗It.IsIn()
应该是It.IsAny()
也许?
It.IsAny<string>() // ... Any string at all
It.Is<string>(s => s == "Foo") // ... Match via a Predicate
It.IsIn<string>("Foo", "Bar", "Baz") // ... Match via a List
[Test]
public async void MyTest() // ... The UT can be made async
{
var mock = new Mock<IAuthenticationInterface>();
mock.Setup(e => e.IsAuthorizedAsync(It.IsIn<string>("Foo"), It.IsAny<MyEvent>()))
.ReturnsAsync(true) // ... Async
.Verifiable();
// async calls can be awaited
Assert.True(await mock.Object.IsAuthorizedAsync("Foo", null));
}