NSubstitute:Assert不包含Throws的定义

时间:2017-10-19 13:25:18

标签: c# unit-testing nsubstitute

我正在使用Visual Studio附带的测试框架,以及NSubstitute对一个获取系统ID的方法进行单元测试,如果在数据库中找不到系统,则抛出异常... < / p>

public VRTSystem GetSystem(int systemID)
{
  VRTSystem system = VrtSystemsRepository.GetVRTSystemByID(systemID);
  if (system == null)
  {
    throw new Exception("System not found");
  }
  return system;
}

(如果这看起来很奇怪,这个方法有一个特定的商业案例,要求它抛出一个异常,因为返回一个空系统是不可接受的)

我想写一个测试来检查如果系统不存在则抛出异常。我目前有以下内容......

[TestMethod]
public void LicensingApplicationServiceBusinessLogic_GetSystem_SystemDoesntExist()
{
  var bll = new LicensingApplicationServiceBusinessLogic();
  try
  {
    VRTSystem systemReturned = bll.GetSystem(613);
    Assert.Fail("Should have thrown an exception, but didn't.);
  }
  catch () { }
}

通过不模拟存储库,VrtSystemsRepository.GetVRTSystemByID()返回的系统将为null,并抛出异常。虽然这有效,但我看起来不对。我不希望在测试中需要try / catch块。

NSubstitute docs有一个例子暗示我应该能够按如下方式测试...

[TestMethod]
public void GetSystem_SystemDoesntExist()
{
  var bll = new LicensingApplicationServiceBusinessLogic();
  Assert.Throws<Exception>(() => bll.GetSystem(613));
}

但是,如果我在测试代码中尝试此操作,我会以红色突出显示Throws,并显示错误消息&#34; Assert不包含投掷定义&#34 ;

现在,我确实不确定该页面上的示例是否涵盖了我的场景,因为测试代码指定了测试中的方法引发了一个异常,我并不理解,正如我所想的那样测试的想法是单独测试方法,并测试在各种情况下发生的情况。但是,即使没有这个,我也不明白为什么Assert.Throws方法不存在。

任何想法?

编辑:DavidG指出Assert.Throws可能是NUnit的一部分,而不是MS框架,这可以解释为什么它不被识别。如果是这样,我目前正在测试正确的方式吗?

1 个答案:

答案 0 :(得分:2)

如DavidG所述,引用文档使用NUnit进行断言。

如果不使用该框架,您可以使用ExpectedExceptionAttribute Class

[TestMethod]
[ExpectedException(typeof(<<Your expected exception here>>))]
public void GetSystem_SystemDoesntExist() {
    var bll = new LicensingApplicationServiceBusinessLogic();
    bll.GetSystem(613);
}

如果未抛出预期的异常,则会失败。