关于这个的任何想法?我正在尝试编写一个单元测试,它将删除一个项目并通过尝试通过其ID来检索项目来确认该项目不再存在于存储库中,该ID应该抛出DataAccessException。但是,测试仍然失败。我添加了一个try catch块,果然我抓住了我期待的异常。我正在使用VS测试工具进行单元测试。
[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);
}
}
答案 0 :(得分:5)
我将通过指出“ExpectedException”属性很糟糕来补充Jared所说的内容。没有办法断言异常的消息是正确的(“消息”参数没有做你想象的那样)并且你不能在一次测试中检查多个异常。
更好的解决方案是做这样的事情: http://geekswithblogs.net/sdorman/archive/2009/01/17/unit-testing-and-expected-exceptions.aspx
该课程可以让你做这样的好事:
[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")); }
答案 1 :(得分:4)
您需要将ExpectedException属性添加到具有TestMethod属性的同一方法上。 VS单元测试框架仅在特定测试的入口点查找ExpectedException属性。
[TestMethod]
[ExpectedException(typeof(DataAccessException))]
public void ATestMethod() {
...
NHibernateRepositoryBaseDeleteHelper(itemValue, keyValue);
}
答案 2 :(得分:0)
首先要删除删除方法。我会有一个单独的删除方法和测试方法。是的,您正在测试删除,但实际上您正在测试与删除相关联的行为。这里可能还有其他测试。
由于这是自动生成测试的一部分,我不会在该测试中添加相同的存储库对象,但会在自己的测试方法中执行我的测试,并使用delete作为为班级设置。这肯定会将测试与删除分开。
希望这有帮助。