我有一个类API其具有充分代码的复盖范围和使用DI嘲笑了所有的逻辑中的主要类的职能(工作。运行),其做所有的工作。

我发现了一个错误的产生我们不做一些验证上的一项数据输入的领域。

因此,我增加了一个短功能称为ValidateFoo()...写了一个单元的测试对这种功能期望一个JobFailedException,跑的测试失败了很显然因为这一职能是空的。我加入验证逻辑,现在通过测试。

很好,现在我们知道的验证工作。问题是我怎么写的测试,以确保ValidateFoo()实际上是所谓的内部工作。运行()?ValidateFoo()是一个私人的方法的工作类-所以它不是一个接口...

反正是有这样做NMock2.0?我知道TypeMock支持伪造的无接口的类型。但是,变化的模拟库,现在不是一个选项。在这一点上,如果NMock不能支持它,我将只是简单地添加ValidateFoo()调到运行()方法和测试的东西动手动--这很显然,我宁愿不这样做考虑我的工作。运行()方法有100%的复盖率现在。任何建议?非常感谢它表示赞赏。

编辑:其他选项,我想是的只是创建一个一体化的测试对于我的工作。运行的功能(注入到它真正实现复合的对象,而不是嘲笑).我会给它一个不好的输入值,领域,然后验证工作失败。这个工程和涵盖了我的试验,但它不是一个真正的单元的测试,但不是一个一体化测试,测试,一个单元的功能。...嗯..

EDIT2:是否有任何方法来做到这?任何人有想法?也许TypeMock-或者一个更好的设计?

有帮助吗?

解决方案

目前版本的NMock2 能模拟的具体类型(我不记得确切的版本,他们加入这一点,但我们使用的版本2.1)使用的大多熟悉的语法:

Job job = mockery.NewMock<Job>(MockStyle.Transparent);
Stub.On(job).Method("ValidateFoo").Will(Return.Value(true));

MockStyle.透明规定,任何东西你不单或期望应该处理由的基础实施-这样你就可以短期望对方法上的一个实例,你的测试。

但是,你只能短,并定期在公共方法(和属性的),这也必须加以虚拟或抽象的。因此,为了避免依赖于一体化测试,你有两个选择:

  • Job.ValidateFoo() 公共的和虚拟的。
  • 提取验证的逻辑成一类新的和注入的一个实例 Job.

其他提示

由于所有私有公共方法都是所谓的(除非依靠反射运行时执行),那么这些下身正在由公共方法执行。这些私有方法导致更改对象超出了简单的执行代码,如设置类字段或调用到其他对象。我会找到一个办法让那些调用私有方法的“结果”。 (或者嘲笑那不应该在私有方法来执行的事。)

我不能看到待测类。可能还让你想访问私有方法的另一个问题是,这是一个超级大的类的私密功能勿庸置疑。这些类可能需要被分解成更小的类,并且其中一些下身可能变成简单的公众。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top