Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq lambda表达式的行为异常_C#_Unit Testing_Lambda_Mocking_Moq - Fatal编程技术网

C# Moq lambda表达式的行为异常

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

我有一个使用MOQ的单元测试,它的表现出乎意料。我希望IsAuthorizedAsync方法总是返回true,但它返回false。下面是将IsAuthorizedAsync方法添加到我的模拟对象的代码的简化版本

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