如何在 TestProject 中使用 NSubstitute 将值设置为 class 的局部变量?
How to set value to a local variable of a class using NSubstitute in TestProject?
我需要使用 NSubstitute 进行模拟,并且需要设置 class LoanCreateHandler
的局部变量 command
以使用其参数 Z
模拟数据.
我有如下代码:
public class ClassA {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
… // Here I have some other properties
}
public class CreateLoanCommand {
public string X { get; set; }
public string Y { get; set; }
public ClassA Z { get; set; }
}
public class LoanCreateHandler {
public Response Handle(LoanCreateRequest request)
{
var response = CreateTypedResponse();
var command = new CreateLoanCommand
{
X = request.X,
Y = request.Y
};
_cqsCommandProcessor.Execute(command); //here I am setting value of command.Z param
if (command.Z == null)
{
//do something
}else{
//do another
}
return true; // returns response
}
}
所以在这里我想模拟 LoanCreateHandler
代码覆盖率。 Else 循环代码没有被覆盖。请在下面找到单元测试:
[TestClass]
public class LoanCreateHandlerTests
{
[TestMethod, TestCategory(Tc.Unit)]
public void LoanCreateHandler_SuccessTest()
{
var loanCreateRequest = new LoanCreateRequest
{
X = "val1",
Y = "val2"
};
var loanCreateResponse = true;
var createLoanCommand = new CreateLoanCommand()
{
X = "val1",
Y = "val2",
Z = new ClassA()
{
Prop1 = "val1", Prop2 = "val2"…
}
};
_TestHelper.CqsCommandProcessor.Execute(Arg.Any<CreateLoanCommand>());
var loanCreateHandler = new LoanCreateHandler();
loanCreateHandler.Handle(loanCreateRequest).Returns(loanCreateResponse);
//here when call goes to Handle() method it creates new LoanCreateRequest object and I want to replace that object with my LoanCreateRequest object, which is created above.
Assert.IsNotNull(loanCreateResponse);
}
}
您应该使用 When..Do 回调来设置 void
方法。
我假设 _TestHelper.CqsCommandProcessor
returns 和 LoanCreateHandler._cqsCommandProcessor
是同一个对象。
也就是说,你应该这样做:
[TestClass]
public class LoanCreateHandlerTests
{
[TestMethod, TestCategory(Tc.Unit)]
public void LoanCreateHandler_SuccessTest()
{
var z = new ClassA()
{
Prop1 = "val1",
Prop2 = "val2"
};
_TestHelper.CqsCommandProcessor
.When(x => x.Execute(Arg.Any<LoanCreateRequest>()))
.Do(x => x.Arg<LoanCreateRequest>().Z = z);
var loanCreateHandler = new LoanCreateHandler();
var loanCreateRequest = new LoanCreateRequest
{
X = "val1",
Y = "val2"
};
var loanCreateResponse = loanCreateHandler.Handle(loanCreateRequest);
Assert.IsNotNull(loanCreateResponse);
}
}
我需要使用 NSubstitute 进行模拟,并且需要设置 class LoanCreateHandler
的局部变量 command
以使用其参数 Z
模拟数据.
我有如下代码:
public class ClassA {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
… // Here I have some other properties
}
public class CreateLoanCommand {
public string X { get; set; }
public string Y { get; set; }
public ClassA Z { get; set; }
}
public class LoanCreateHandler {
public Response Handle(LoanCreateRequest request)
{
var response = CreateTypedResponse();
var command = new CreateLoanCommand
{
X = request.X,
Y = request.Y
};
_cqsCommandProcessor.Execute(command); //here I am setting value of command.Z param
if (command.Z == null)
{
//do something
}else{
//do another
}
return true; // returns response
}
}
所以在这里我想模拟 LoanCreateHandler
代码覆盖率。 Else 循环代码没有被覆盖。请在下面找到单元测试:
[TestClass]
public class LoanCreateHandlerTests
{
[TestMethod, TestCategory(Tc.Unit)]
public void LoanCreateHandler_SuccessTest()
{
var loanCreateRequest = new LoanCreateRequest
{
X = "val1",
Y = "val2"
};
var loanCreateResponse = true;
var createLoanCommand = new CreateLoanCommand()
{
X = "val1",
Y = "val2",
Z = new ClassA()
{
Prop1 = "val1", Prop2 = "val2"…
}
};
_TestHelper.CqsCommandProcessor.Execute(Arg.Any<CreateLoanCommand>());
var loanCreateHandler = new LoanCreateHandler();
loanCreateHandler.Handle(loanCreateRequest).Returns(loanCreateResponse);
//here when call goes to Handle() method it creates new LoanCreateRequest object and I want to replace that object with my LoanCreateRequest object, which is created above.
Assert.IsNotNull(loanCreateResponse);
}
}
您应该使用 When..Do 回调来设置 void
方法。
我假设 _TestHelper.CqsCommandProcessor
returns 和 LoanCreateHandler._cqsCommandProcessor
是同一个对象。
也就是说,你应该这样做:
[TestClass]
public class LoanCreateHandlerTests
{
[TestMethod, TestCategory(Tc.Unit)]
public void LoanCreateHandler_SuccessTest()
{
var z = new ClassA()
{
Prop1 = "val1",
Prop2 = "val2"
};
_TestHelper.CqsCommandProcessor
.When(x => x.Execute(Arg.Any<LoanCreateRequest>()))
.Do(x => x.Arg<LoanCreateRequest>().Z = z);
var loanCreateHandler = new LoanCreateHandler();
var loanCreateRequest = new LoanCreateRequest
{
X = "val1",
Y = "val2"
};
var loanCreateResponse = loanCreateHandler.Handle(loanCreateRequest);
Assert.IsNotNull(loanCreateResponse);
}
}