Questions tagged «stub»

8
在不进行广泛模拟的情况下,应该如何编写单元测试?
据我了解,单元测试的重点是隔离测试代码单元。这意味着: 它们不应被代码库中其他地方不相关的代码更改破坏。 与集成测试相反(集成测试可能会中断),只有一个单元测试应该通过被测试单元中的错误来破坏。 所有这些暗示着,应该模拟掉测试单元的所有外部依赖关系。我的意思是所有外部依赖关系,而不仅仅是网络,文件系统,数据库等“外部层”。 这得出一个合理的结论,几乎每个单元测试都需要模拟。另一方面,谷歌对嘲笑的快速搜索显示了成千上万的文章声称“嘲笑是一种代码味道”,应该(尽管不完全)避免。 现在,到问题。 单元测试应如何正确编写? 它们和集成测试之间的界线到底在哪里? 更新1 请考虑以下伪代码: class Person { constructor(calculator) {} calculate(a, b) { const sum = this.calculator.add(a, b); // do some other stuff with the `sum` } } 可以在Person.calculate不模拟Calculator依赖关系的情况下测试该方法的测试(假定,它Calculator是不访问“外部世界”的轻量级类)可以视为单元测试吗?


3
假冒被测课程的一部分可以吗?
假设我有一个类(请原谅人为的示例及其错误的设计): class MyProfit { public decimal GetNewYorkRevenue(); public decimal GetNewYorkExpenses(); public decimal GetNewYorkProfit(); public decimal GetMiamiRevenue(); public decimal GetMiamiExpenses(); public decimal GetMiamiProfit(); public bool BothCitiesProfitable(); } (请注意,GetxxxRevenue()和GetxxxExpenses()方法具有依赖项,这些依赖项已被删除) 现在,我正在对取决于GetNewYorkProfit()和GetMiamiProfit()的BothCitiesProfitable()进行单元测试。可以对GetNewYorkProfit()和GetMiamiProfit()存根吗? 似乎如果我不这样做,那么我同时要同时测试GetNewYorkProfit()和GetMiamiProfit()以及BothCitiesProfitable()。我必须确保为GetxxxRevenue()和GetxxxExpenses()设置存根,以便GetxxxProfit()方法返回正确的值。 到目前为止,我只看到了对外部类而非内部方法的依赖关系进行存根的示例。 如果可以的话,是否应该使用一种特定的模式来执行此操作? 更新 我担心我们可能会遗漏核心问题,这可能是我的拙劣例子的错。基本的问题是:如果一个类中的方法依赖于该类中另一个公开的方法,是否可以(甚至建议)将另一个方法存根? 也许我错过了一些东西,但是我不确定分班总是有意义的。也许另一个更好的例子是: class Person { public string FirstName() public string LastName() public string FullName() } 全名定义为: public string …

4
模拟是否违反开放/封闭原则?
前段时间,我在找不到的Stack Overflow答案上读了一句话,该句子解释您应该测试公共API,而作者说您应该测试接口。作者还解释说,如果更改了方法实现,则无需修改测试用例,因为这样做会破坏确保被测系统正常工作的契约。换句话说,如果方法不起作用,则测试应该失败,但这不是因为实现发生了变化。 当我们谈论嘲笑时,这引起了我的注意。由于模拟在很大程度上依赖于被测系统依赖项的期望调用,因此模拟与实现紧密相关,而不是与接口紧密相关。 在研究模拟与存根时,有几篇文章认为应该使用存根而不是模拟,因为它们不依赖于依赖项的期望,这意味着测试不需要了解测试实施中的基础系统。 我的问题是: 模拟是否违反开放/封闭原则? 在上一段中支持存根的论点中是否缺少某些内容,使存根与模拟不那么好? 如果是这样,什么时候可以模拟一个好用例,什么时候可以使用存根?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.