C# 如何通过Nunit模拟新对象的构造
我想编写一个nunit测试来测试一个方法,但我无法模拟该方法中实例化的对象 代码如下:C# 如何通过Nunit模拟新对象的构造,c#,nunit,C#,Nunit,我想编写一个nunit测试来测试一个方法,但我无法模拟该方法中实例化的对象 代码如下: public class Converter() { public void modifyScore(string convertTo){ ScoreConverter scoreConverter; if(convertTo.Equals("decimal"){ scoreConverter = new DecimalScoreConverte
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测试此方法?单元测试主要基于状态更改。因此,自然的过程是:
- 在课堂上做点什么
- 测试类的状态是否按预期更改
也许您可以考虑代码中的更改来测试SCOMPIENTER的类型:
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变量的类型
如果您不想将属性公开,另一种选择是将其内部化,然后添加,或者使用工厂类,然后在测试中模拟它,正如amcdermott指出的那样
你好 首先,你应该开始反对抽象。 我认为所有模拟框架都需要这样做。 根据你给我的信息和一些假设: 不管怎样,我们走吧:
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());
var scoreConverterResponse=“theStringYouWantToBeReturned”
var scoreConverterMock=new Mock();
scoreConverterMock.Setup(sc=>sc.DetermineScore())
.返回(scoreConverterResponse);
Verify(sc=>sc.DetermineScore(It.IsAny()),Times.atlestOnce());
我修正了命名约定,比如CamelCase方法。
我是动态编写的,因此如果出现编译错误,我深表歉意。最简单的方法,也可以说是迄今为止最好的方法是重写该方法,这样它就不会像那样实例化对象。在这种情况下,这可能吗?我会附和这种观点-使用
ConverterFactory
类返回适当的转换器类型怎么样。然后你可以模拟工厂(使用你选择的模拟工具)并从那里开始。“单元测试主要基于状态变化……”不。@DavidArno,请你解释一下为什么不可以,更详细地说,将局部变量推到类级别只是为了让它们能够被测试所访问,感觉这不是正确的设计决策。