从接收到的调用中提取参数并对它们进行断言

时间:2015-07-09 18:15:50

标签: c# nsubstitute

如何对来自已接来电的参数进行断言?以下示例不起作用,因为传递给 { "header":{ "callbackUrl":"", "clientOrderId":"A565132", "clientOriginationId":"2345FE", "serviceProvider":"VERIZON", "transactionId":"EEDT44567" }, "customer": { "nationalIdType":"", "nationalId":"", "addresses":[ { "type":"WORK", "postalCode":"330066" } ], "serviceProviderAuthentication":[ { "passcode":"", "securityQuestion":"", "securityAnswer":"" } ] }, "accountPhoneNumber":"", "accountNumber":"" } 的操作永远不会被调用。

Arg.Do()

1 个答案:

答案 0 :(得分:3)

标准方法是在收到正确的参数的情况下断言调用,而不是捕获参数并在其上声明。

View viewCanvas = findViewById(R.id.viewCanvas);
viewCanvas.setValue(42);

您可以将更多或更少的代码提取到不同的方法中,以使其更具可读性。

这种方法的问题在于它没有像FluentAssertions那样提供关于参数之间差异的尽可能多的信息。在这些情况下,我们可以回溯到provider.Received(1) .SetValuesAsync(Arg.Is<IEnumerable<KeyValuePair<string,object>>>( pairs => SameElements(pairs, new [] { Tuple.Create("Key1", "foo"), ... }))); When..Do以根据您的问题捕获参数。在这些情况下,我们不想使用Arg.Do,我们只是调用它来调用,以便在调用时执行特定操作。还要确保在调用被测试方法之前设置Received回调。

Do

或者我们可以使用//Arrange IEnumerable<KeyValuePair<string, object>> receivedArgs = null; provider.SetValuesAsync( Arg.Do<IEnumerable<KeyValuePair<string,object>>>(x => receivedArgs = x) ); // Act: callWeAreTesting(); // Assert: receivedArgs.Should().... 语法:

When..Do