Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过Nunit模拟新对象的构造_C#_Nunit - Fatal编程技术网

C# 如何通过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

我想编写一个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测试此方法?

单元测试主要基于状态更改。因此,自然的过程是:

  • 在课堂上做点什么
  • 测试类的状态是否按预期更改

也许您可以考虑代码中的更改来测试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,请你解释一下为什么不可以,更详细地说,将局部变量推到类级别只是为了让它们能够被测试所访问,感觉这不是正确的设计决策。