如何通过Nunit模拟新对象的构造
本文关键字:对象 何通过 Nunit 模拟 新对象 | 更新日期: 2023-09-27 17:49:36
我想写一个nunit测试来测试一个方法,但是我不能模拟在该方法中实例化的对象。
代码如下:
public class Converter()
{
public void modifyScore(string convertTo){
ScoreConverter scoreConverter;
if(convertTo.Equals("decimal"){
scoreConverter = new DecimalScoreConverter();
scoreConverter.determineScore();
}
else{
scoreConverter = new IntegerScoreConverter();
scoreConverter.determineScore();
}
}
我想为modifyScore写一个测试,并想测试哪个对象的方法被调用了
如何使用nunit测试此方法?
首先,您应该开始处理抽象。我认为这是所有模拟框架都需要的。从你给我的信息,和几个假设:
不管怎样,我们开始吧:
public Interface IConverter
{
IScoreConverter ScoreConverter { get; set; };//use constructorinjection instead
void ModifyScore(string convertTo);
}
public Interface IScoreConverter
{
DetermineScore();
}
我建议你看看最小起订量。
你需要弄清楚你想要内部对象返回什么。现在还没有从ModifyScore返回任何值,所以没有什么要测试的。
如果你要返回一个字符串,测试可能是这样的:
var scoreConverterResponse = "theStringYouWantToBeReturned"
var scoreConverterMock = new Mock<IScoreConverter>();
scoreConverterMock.Setup(sc => sc.DetermineScore())
.Returns(scoreConverterResponse);
scoreConverterMock.Verify(sc => sc.DetermineScore(It.IsAny<string>()), Times.AtLeastOnce());
我修正了命名约定,即CamelCase方法。我是在匆忙中写的这篇文章,如果有编译错误,我深表歉意。
单元测试主要基于状态更改。因此,自然的过程是:
- 在类上做点什么
- 测试类的状态是否按预期变化
也许你可以考虑修改代码来测试scoreConverter的类型:
public class Converter
{
public ScoreConverter scoreConverter { get; set; }
public void modifyScore(string convertTo){
if(convertTo.Equals("decimal"){
scoreConverter = new DecimalScoreConverter();
}
else{
scoreConverter = new IntegerScoreConverter();
}
scoreConverter.determineScore();
}
您的测试可以执行modifyScore()方法,然后断言scoreConverter变量的类型。
如果你不想让属性公开,另一个选择是让它成为内部的,然后添加InternalsVisibleToAttribute,或者使用一个Factory类,然后在测试中模拟它,正如amcdermott指出的。
问候!