如何通过Nunit模拟新对象的构建

时间:2015-05-18 10:47:36

标签: c# nunit

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

2 个答案:

答案 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指出的那样进行。

问候!