gpt4 book ai didi

c# - 单元测试 101 - 从我的单元中抛出异常

转载 作者:行者123 更新时间:2023-11-30 22:09:54 25 4
gpt4 key购买 nike

我问了一个相关的问题。我想根据我在帖子中提供的不充分信息,对这两个发帖人提供的信息表示赞赏。他们在这里引导我提出这个问题。如果我能理解这一点,那么我将感谢迄今为止帮助过我的发帖人以及你们中任何乐于助人的人。

我有一个界面

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);

}

我的 MVC 应用程序会像 pig 一样快乐……你知道的,只要这个契约得到满足。哇,一切都很好。

所以你看,我有一个这样实现的 DeleteItem 方法:

    public string DeleteItem(int ItemId)
{

using (var context = new InventoryEF())
{
var item = context.InventoryItems.Find(ItemId);
if (item != null)
{
try
{
context.InventoryItems.Remove(item);
context.SaveChanges();
return "";
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return e.InnerException.ToString();
}
}
else
{
return "Id not found for delete";
}
}
}

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

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

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

最佳答案

using (var context = new InventoryEF())

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

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

类似这样,请检查语法:

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

正如在另一个回复中指出的,您还应该拥有 ExpectedExceptionAttribute,或者如果您使用 FluentAssertions,您也可以期待异常内联

关于c# - 单元测试 101 - 从我的单元中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21237763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com