繁体   English   中英

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

[英]How to Mock construction of new objects through 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测试此方法?

首先,您应该开始反对抽象。 我认为所有模拟框架都需要这样做。 根据您提供给我的信息以及一些假设:

无论如何,我们开始:

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());

我修复了命名约定toom即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所指出的。

问候!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM