我正在使用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框架,这可以解释为什么它不被识别。如果是这样,我目前正在测试正确的方式吗?
答案 0 :(得分:2)
如DavidG所述,引用文档使用NUnit进行断言。
如果不使用该框架,您可以使用ExpectedExceptionAttribute Class
[TestMethod]
[ExpectedException(typeof(<<Your expected exception here>>))]
public void GetSystem_SystemDoesntExist() {
var bll = new LicensingApplicationServiceBusinessLogic();
bll.GetSystem(613);
}
如果未抛出预期的异常,则会失败。