- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这些年来,我已经使用过几次自分流单元测试模式。正如我最近向某人解释的那样,他们认为这违反了 SRP。论点是测试类现在可以出于以下两个原因之一进行更改:当测试更改时,或者当测试正在实现的接口(interface)上的方法签名发生更改时。想了想,似乎这是一个正确的评估,但我想得到其他人的意见。想法?
引用:
http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf
最佳答案
我对此的看法是,测试类在技术上违反了 SRP,但并不违反 SRP 的精神。自分流的替代方法是让模拟类与测试类分开。
使用单独的模拟类,您可能会认为它是自包含的并满足 SRP,但是与模拟类属性的语义耦合仍然存在。所以,真的,我们没有实现任何有意义的分离。
以 PDF 中的示例为例:
public class ScannerTest extends TestCase implements Display
{
public ScannerTest (String name) {
super (name);
}
public void testScan () {
// pass self as a display
Scanner scanner = new Scanner (this);
// scan calls displayItem on its display
scanner.scan ();
assertEquals (new Item (“Cornflakes”), lastItem);
}
// impl. of Display.displayItem ()
void displayItem (Item item) {
lastItem = item;
}
private Item lastItem;
}
现在我们制作一个 Mock:
public class DisplayMock implements Display
{
// impl. of Display.displayItem ()
void displayItem (Item item) {
lastItem = item;
}
public Item getItem() {
return lastItem;
}
private Item lastItem;
}
public class ScannerTest extends TestCase
{
public ScannerTest (String name) {
super (name);
}
public void testScan () {
// pass self as a display
DisplayMock dispMock = new DisplayMock();
Scanner scanner = new Scanner (dispMock );
// scan calls displayItem on its display
scanner.scan ();
assertEquals (new Item (“Cornflakes”), dispMock.GetItem());
}
}
实际上(恕我直言)
TestClass
的更高耦合度至
DisplayMock
比违反
TestClass
的 SRP 更邪恶.此外,随着使用模拟框架,这个问题完全消失了。
We can accomplish this by using an abstract interface for the database. One implementation of this abstract interface uses the real database. Another implementation is test code written to simulate the behavior of the database and to check that the database calls are being made correctly. Figure 29-5 shows the structure. The
PayrollTest
module tests thePayrollModule
by making calls to it and also implements theDatabase
interface so that it can trap the calls thatPayroll
makes to the database. This allowsPayrollTest
to ensure thatPayroll
is behaving properly. It also allowsPayrollTest
to simulate many kinds of database failures and problems that are otherwise difficult to create. This is a testing pattern known as SELF-SHUNT, also sometimes known as mocking or spoofing.
关于unit-testing - 自分流测试模式是否违反单一职责原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498965/
我刚刚开始 iOS 应用程序开发,到目前为止,这是一次很棒的体验。 Apple 文档很棒,但我有一些问题不是技术性的,只有有经验的人才能回答。 我有一堆 UIViewController 处理它们控制
我几天前开始学习 react-redux-immutable,但我仍然对构建我的应用程序感到困惑。我有 php(symfony/laravel MVC 背景),所以要理解一些 javascript 概
每次查看 SharpDX 代码并尝试遵循 DirectX 文档时,我都会遇到困难。有没有一个地方清楚地列出了每个编号的类映射到什么以及它们存在的原因? 我说的是这样的事情: D
我正在使用 Robospice 库 创建应用程序。这是处理互联网连接的绝佳选择,因为库的核心是基于 Android 服务的,所以我们的连接与 Activity 生命周期无关。 我们正在创建我们的请求并
我可能在这里分析过度了,但是根据我对 MVC 的阅读,似乎有很多关于如何做事情的观点。 是否有一个“最佳实践”网站或文档来定义 MVC 各个部分的职责? 请记住,我使用 EF/Repository&U
我是一名优秀的程序员,十分优秀!