gpt4 book ai didi

testing - 在单元测试中使用依赖注入(inject)对象是个坏主意吗?

转载 作者:行者123 更新时间:2023-11-28 20:04:44 25 4
gpt4 key购买 nike

我不确定我所做的是否真的是使用 DI 进行单元测试的“正确”方法。现在我要求我的 ViewModelLocator 实际创建我需要的所有实例,并且只获取我需要测试的实例,这使得测试单个实例变得非常简单,因为假设 Receipt 需要创建一个 Reseller 对象,reseller 需要要创建一个 User 对象,用户需要创建一些其他对象,这会创建一个对象链来创建只是为了测试一个实例。

通常接口(interface)将被模拟并解析为您想要创建的对象,但是简单的实体/ View 模型如何?

涉及 DI 的单元测试的最佳实践是什么?

 public class JournalTest
{
private ReceiptViewModel receipt;
private ViewModelLocator locator;
[SetUp]
public void SetUp()
{
locator = new ViewModelLocator();

receipt = SimpleIoc.Default.GetInstance<ReceiptViewModel>();
}
[TearDown]



[Test]
public void CheckAndCreateNewJournal_Should_Always_Create_New_Journal()
{
receipt.Sale.Journal = null;
receipt.Sale.CheckAndCreateNewJournal();
Assert.NotNull(receipt.Sale.Journal);
}

}

最佳答案

首先,您没有在代码中使用依赖注入(inject)。你所拥有的称为服务定位器(服务定位器与 IoC/服务定位器紧密耦合并使其难以测试)。

是的,这很糟糕(服务定位器和依赖注入(inject)),因为这意味着:您不是在进行单元测试,而是在进行集成测试。

在您的情况下,ReceiptViewModel 不会单独进行测试,但您的测试还会测试 ReceiptViewModel 的依赖项(即存储库、注入(inject)的服务等)。这称为集成测试。

UnitTest 必须只测试有问题的类并且没有依赖项。您可以通过 stub (依赖项的虚拟实现,假设您已将接口(interface)用作依赖项)或使用模拟(使用像 Moq 这样的模拟框架)来实现这一点。

这更容易/更好,因为您不必实现整个类,而只需为您知道的测试用例所需的方法设置模拟。

作为附加说明,您必须自己创建实体。根据您的 UnitTest 框架,可能有数据驱动的测试(通过测试方法上的属性),或者您只是在代码中创建它们,或者如果您在许多类中使用了模型/实体,请为其创建一个辅助方法。

不应将 View 模型注入(inject)到构造函数中(至少应避免),因为它会将它们紧密耦合

关于testing - 在单元测试中使用依赖注入(inject)对象是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34266882/

25 4 0
文章推荐: javascript - 当鼠标单击第一个