|
|
1
5
我认为RoyOsherove最近发现,作为一个经验法则,你的测试应该基于95%的状态和5%的交互。我同意。 最重要的是你的API做了你想做的,并且 那个 是你需要测试的。如果你测试它如何实现它需要做的工作的机制,你很可能会以过度指定的测试而告终,当涉及到可维护性时,测试会咬你一口。 在大多数情况下,您可以设计您的API,以便基于状态的测试是自然的选择,因为这非常容易。 检查上传示例:调用getpackage和getallcertificates有关系吗?这真的是上传方法的预期结果吗? 我想不会。我的猜测是,上传方法的目的——这是存在的原因——是为了填充并提供正确的视图。 因此,基于状态的测试将检查返回的viewresult及其viewModel,并验证它是否具有所有正确的值。 当然,正如现在的代码所示,您需要为PackageRepository和CertificateRepository提供双重测试,因为否则会抛出异常,但看起来调用存储库方法本身并不重要。 如果您对存储库使用存根而不是模拟,那么您的测试就不再与内部实现细节联系在一起了。如果您稍后决定将upload方法的实现更改为使用包的缓存实例(或其他),则不会调用存根,但这没关系,因为它无论如何都不重要-什么 是 重要的是返回的视图包含预期的数据。 这比测试中断更可取,即使所有返回的数据都是正常的。 有趣的是,您的deny示例看起来像一个基本示例,其中基于交互的测试仍然是有必要的,因为只有通过检查间接输出,您才能验证该方法是否执行了正确的操作(denyPackage方法返回void)。 所有这些,以及更多的,都在这本好书中解释得很好。 xUnit Test Patterns . |
|
|
2
1
要问的问题是,“如果这段代码有效,我怎么知道?”这可能意味着测试一些交互或某种状态,这取决于什么是重要的。
在第一次测试中,
这就是为什么我们在 http://www.mockobjects.com/book |