我在xUnit中使用Moq和NSubstitue实现单元测试时遇到了问题,其中两个方法在同一行中被调用。
public class Class1{
private TestClient _client;
public Class1(TestClient client){
_client = client;
}
//method to write test
public string GetData(){
var response = _client.GetClient().GetSomeData("user");
return response;
}
}
我尝试实现如下单元测试:
[Fact]
public void TestGetData()
{
//Arrange
var input = "user";
var exceptedResponse = "Succeess";
//Act
TestClient moqClient = new Mock<TestClient>();
moqClient.Setup(x => x.GetClient().GetSomeData().Returns("Succeess"));
var result = new Class1().GetData();
//Assert
Assert.Equal(exceptedResponse, result);
}
但在安装行运行测试时,我遇到了如下异常。
消息:系统NotSupportedException:不支持的表达式:。。。=>。。。Returns("Succeess",new[]{}(安装程序中不能使用扩展方法(此处:SubstituteExtensions.Returs(/验证表达式。
堆栈跟踪:警卫IsOverridable(MethodInfo方法,表达式表达式(线87表达式扩展.g_Split|5_0(表达式e、表达式&r,方法期望&p、 布尔赋值,布尔allowNonOverridableLastProperty(线234ExpressionExtensions。Split(LambdaExpression表达式,布尔allowNonOverridableLastProperty(线149嘲弄SetupRecursive[TSetup](模拟、LambdaExpression表达式,函数
4 setupLast, Boolean allowNonOverridableLastProperty) line 643 Mock.Setup(Mock mock, LambdaExpression expression, Condition condition) line 498 Mock
1.Setup[TResult](表达式`1表达式(线452
请帮助我们如何使用Moq或NSubscribe实现对此的嘲讽。
谢谢。
这里真正的问题是GetClient
方法返回某个类型,而GetSomeData
方法是在该类型上定义的。
因此,让我们假设TestClient。GetClient返回IClient
(任意类型,因为问题没有提供类型(。您可以创建一个Mock<IClient>
并模拟GetSomeData
方法。然后,您应该模拟GetClient方法(如果可能的话(以返回mockClient.Object
,这样就可以检索模拟的返回值。
希望有帮助,