gpt4 book ai didi

unit-testing - 使用假货或模拟进行单元测试?

转载 作者:行者123 更新时间:2023-12-03 14:58:01 26 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




8年前关闭。




在编写我的测试套件时,我试图遵循良好的做法。中途我意识到我花了很多(大部分)时间在假对象上......我的大多数测试都做这样的事情

public interface ITemplateRepository
{
string get GetGenericTemplate {get;}
}


public FakeTemplateRepository : ITemplateRepository
{
public string GetGenericTemplate ()
{
return "<xml>Complex</xml>";
}
}
[Test]
public void CanGetGenericTemplate()
{
ITemplateRepository rep = new FakeTemplateRepository();
Assert.IsNotNull(rep.GetGenericTemplate());
}
[Test]
public void GetGenericTemplateContains()
{
ITemplateRepository rep = new FakeTemplateRepository();
Assert.IsTrue(rep.GetGenericTemplate().StartsWith("<xml>"));
}

我实际上发现自己在 FakeTemplateRepository 上花费了大量时间,以确保它返回我期望的实际内容。这是坏事吗?

这仍然是有效的单元测试吗?单元测试应该快速而简单,不是吗?但老实说,我不太确定,可以肯定的一件事是它让我想到了我的数据的形状和内容。 FakeRepository 中的内容或多或少会反射(reflect)我的生产内容,尽管是从文件系统而不是内存中读取的。

如果实际上我正在做的是集成测试,那么我应该如何使用模拟进行单元测试?

我设置期望值以便它调用方法并返回一个字符串对我来说没有意义(如果使用 Mocks)?我是否遗漏了一些东西,但我看不到那里有多大值(value)?如果我设置了无效的方法名称,代码甚至无法编译!

我对整件事真的很困惑,我对单元测试的看法现在完全模糊了所有这些概念。

任何人都可以用一个 super 简单的例子来演示假货和模拟如何融入套件吗?例如,什么应该是单元测试,什么应该是集成测试?

谢谢

最佳答案

再一次……另一个人陷入了模拟反模式。您正在“测试 Mock”或 Fake 对象 - 这根本没有任何用处。
需要使用模拟来抽象出测试对象的依赖项或合作者......而不是测试对象本身。

首先,我会说阅读 Martin Fowler 的论文“Mocks Aren't Stubs”。如果您想为特定参数返回值或设置期望值,请使用 Roll-your-own fakes 上的模拟框架。假货通常用于剔除合作者......在那里你不关心合作者......例如 stub 网络或文件 IO。
下一步阅读 this similar SO question和它的答案..

关于unit-testing - 使用假货或模拟进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475425/

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