我想编写一个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测试此方法?
答案 0 :(得分:0)
首先,你应该开始反对抽象。 我认为这是所有模拟框架都需要的。 从你给我的信息和几个假设:
无论如何,我们走了:
public Interface IConverter
{
IScoreConverter ScoreConverter { get; set; };//use constructorinjection instead
void ModifyScore(string convertTo);
}
public Interface IScoreConverter
{
DetermineScore();
}
我建议您查看MoQ。
您需要弄清楚内部对象要返回的内容。 目前您没有从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());
我修改了命名约定toom,即CamelCase方法。 我是在动态编写的,所以如果有编译错误我会道歉。
答案 1 :(得分:-1)
单元测试主要基于状态变化。所以,自然的过程是:
也许您可以考虑更改代码以测试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指出的那样进行。
问候!