C# 单元测试101-从我的单元内引发异常

C# 单元测试101-从我的单元内引发异常,c#,unit-testing,moq,C#,Unit Testing,Moq,我问了一个相关的问题。我想赞扬这两张海报,因为它们提供的信息是基于我在帖子中的不充分信息。他们把我引向了这个问题。如果我能理解这一点,那么我要感谢那些迄今为止帮助过我的海报,以及你们这些乐于助人的人 我有一个接口 public interface InventoryRepository { List<Location> GetLocations(); List<InventoryItem> GetItems(); List<Invento

我问了一个相关的问题。我想赞扬这两张海报,因为它们提供的信息是基于我在帖子中的不充分信息。他们把我引向了这个问题。如果我能理解这一点,那么我要感谢那些迄今为止帮助过我的海报,以及你们这些乐于助人的人

我有一个接口

public interface InventoryRepository
{


    List<Location> GetLocations();
    List<InventoryItem> GetItems();
    List<InventoryItem> GetItems(int LocationId);
    HomeMadeItem GetHomeMadeItem(int ItemId);
    StoreBoughtItem GetStoreBoughtItem(int ItemId);
    Location GetLocation(int LocationId);
    int SaveHomeMadeItem(HomeMadeItem item);
    string DeleteItem(int id);

}
我可以很容易地设计一个单元测试,测试成功删除或未找到项时的返回值。我不知道如何设计一个单元测试来演示抛出异常的正确返回值

建议最低起订量。但我最初的问题不够清楚,我无法确定这是正确的方法

有人对如何设计这个单元测试有什么建议吗

using (var context = new InventoryEF())
这是一个问题,因为您正在直接实例化依赖项。您需要以某种方式使上下文可注入(这是不同讨论的一部分)

一旦拥有InventoryEF依赖项,就可以模拟上下文正在使用的任何方法,然后通过MOQ框架对其抛出异常,以便能够测试异常处理

类似于此,请检查语法:

var mockContext = new Mock<IInventoryEF>();
mockContext.Setup(c=>c.SaveChanges()).Throws<Exception>();
var mockContext=new Mock();
mockContext.Setup(c=>c.SaveChanges()).Throws();

正如在另一个答复中指出的,您还应该为
ExpectedException
设置
属性,或者如果您使用
FluentAssertions
,您也可以使用
内联
异常

如果您只想捕获一个特定的异常,而您还没有使用MOQ,我建议使用
ExpectedExceptionAttribute

[TestMethod]
[ExpectedException(typeof(IDNotFoundException))]
public void WhicheverTestMethod()
{
  ..
}
当然,异常的类型可以是您想要的任何类型。我相当肯定你也可以对照这条信息进行检查


一般来说,我还建议不要捕获类型
Exception
并获取
InnerException
,因为可能没有内部异常,你不能真正测试所有可能的异常,因为异常是可扩展的。

我不太清楚你的意思,但是很多单元测试框架都有一个ExpectedException检查。您正在使用哪个框架?将处理逻辑与异常处理/状态逻辑分开。将处理逻辑作为单元测试进行测试。在更高的层次上测试状态逻辑。好了,我得到了一篇关于依赖注入的文章,这篇文章实际上可能会解决这个问题。谢谢。所以wrt“你需要让上下文以某种方式可注入(这是不同讨论的一部分)。”所以wrt“你需要让上下文以某种方式可注入(这是不同讨论的一部分)。”你愿意接受上述讨论吗?根据James Shore的说法,“依赖注入意味着为对象提供其实例变量。”。我不明白。在这个问题的范围内,这是您可以谈论或链接到的东西吗?它可以像在存储库构造函数中注入上下文或上下文工厂一样简单。我的意思是有很多方法可以做到这一点,最基本的想法是你可以把它注入到类中,而不是让类在内联实例化一个新的实例。我刚刚在IoC上找到了一些关于Pluralsight的基本信息,这似乎是一个密切相关的话题(甚至可能是DI的超集)。我建议不要使用
ExpectedException
-有。@ChrisMantle:这是一个很好的观点。此外,若你们的商店太喜欢代码覆盖率,那个么这个属性会以一种相当愚蠢的方式降低代码覆盖率。然而,大多数缺点包括知道哪一行抛出了异常或处理多个异常。因为一个测试应该只测试一件事,这两个都不是真正有说服力的论据,特别是当它们需要包含更多的引用或添加更多的代码来进行异常检查时,这种方式只有争议性的优势。而我的大脑掌握着这些东西。我想生成一个会导致抛出异常的测试。但我想我在这里听到的是不要抓住例外。让它被抛起来?我认为理解好的OOD有一些基本的失败。已经好几年了!谢谢。@user2919960:我说不要捕捉异常,不要避免捕捉异常。这是一个非常重大的区别。您应该始终限制要捕获的异常,除非您位于应用程序的最外层并记录它们。
[TestMethod]
[ExpectedException(typeof(IDNotFoundException))]
public void WhicheverTestMethod()
{
  ..
}