C# ExpectedException未捕获异常,但我可以使用try-catch捕获它
关于这个有什么想法吗?我正在尝试编写一个单元测试,该测试将删除一个项,并通过尝试按其ID检索该项(该ID应引发DataAccessException)来确认该项不再位于存储库中。然而,测试一直失败。我添加了一个try-catch块,果然捕捉到了预期的异常。我正在使用VS测试工具进行单元测试C# ExpectedException未捕获异常,但我可以使用try-catch捕获它,c#,visual-studio,unit-testing,exception,C#,Visual Studio,Unit Testing,Exception,关于这个有什么想法吗?我正在尝试编写一个单元测试,该测试将删除一个项,并通过尝试按其ID检索该项(该ID应引发DataAccessException)来确认该项不再位于存储库中。然而,测试一直失败。我添加了一个try-catch块,果然捕捉到了预期的异常。我正在使用VS测试工具进行单元测试 [ExpectedException(typeof(DataAccessException))] private static void NHibernateRepositoryBaseDel
[ExpectedException(typeof(DataAccessException))]
private static void NHibernateRepositoryBaseDeleteHelper<T, TKey>(T myItem, TKey myItemId)
{
MyTestRepository<T, TKey> myRepository = new MyTestRepository<T, TKey>();
myRepository.Delete(myItem);
myRepository.CommitChanges();
try
{
myRepository.GetById(myItemId, false);
}
catch (DataAccessException dae)
{
Assert.IsTrue(true);
}
}
[ExpectedException(typeof(DataAccessException))]
私有静态void NHibernateRepositoryBaseDeleteHelper(T myItem,TKey myItemId)
{
MyTestRepository myRepository=新建MyTestRepository();
myRepository.Delete(myItem);
myRepository.CommitChanges();
尝试
{
GetById(myItemId,false);
}
捕获(DataAccessException dae)
{
Assert.IsTrue(真);
}
}
您需要将ExpectedException属性添加到具有TestMethod属性的相同方法中。VS单元测试框架将只在特定测试的入口点查找ExpectedException属性
[TestMethod]
[ExpectedException(typeof(DataAccessException))]
public void ATestMethod() {
...
NHibernateRepositoryBaseDeleteHelper(itemValue, keyValue);
}
首先,您正在使用delete方法。我将有一个单独的删除方法和测试方法。是的,您正在测试删除,但实际上您正在测试与删除关联的行为。这里可能还有其他测试 由于这是一个自动生成的测试的一部分,我不会在该测试中添加到同一个存储库对象,而是在它们自己的测试方法中执行测试,并将删除作为类设置的一部分。这肯定会将测试与删除分开
希望这能有所帮助。我会补充Jared的话,指出“ExpectedException”属性很糟糕。无法断言异常的消息是正确的(“message”参数的作用与您可能认为的不同),也无法在一个测试中检查多个异常 更好的解决方案是这样做: 这门课让你可以做一些整洁的事情,比如: [TestMethod] public void TestAFewObviousExceptions() { // some setup here ExceptionAssert.Throws("Category 47 does not exist", () => wallet.Categories.GetChildCategoryIds(47)); ExceptionAssert.Throws("Id Flim is not valid", () => wallet.Categories.IdFromName("Flim")); } [测试方法] 公共无效TestAfowViousExceptions() { //这里有一些设置 异常assert.Throws(“类别47不存在”,()=> 钱包。类别。GetChildCategoryId(47)); ExceptionAssert.Throws(“Id Flim无效”,()=> 钱包。类别。IdFromName(“Flim”); }
必须给你一个+1的链接。:)只是好奇,你是否需要在博客文章中编辑或添加ExceptionAssert类?我最初在回答中写道“我基于该代码编写了自己的exception类”,但现在我将我使用的函数与该网站上的函数进行了比较,看起来我所做的只是逐字逐句地将其粘贴到我自己的命名空间中。:-)