Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用MS Fakes的TDD_Unit Testing_Tdd_Microsoft Fakes - Fatal编程技术网

Unit testing 使用MS Fakes的TDD

Unit testing 使用MS Fakes的TDD,unit-testing,tdd,microsoft-fakes,Unit Testing,Tdd,Microsoft Fakes,我将尝试TDD,我正在为此研究合适的工具。 在工作中,我们使用MS Fakes,因此不更改它并将MS Fakes与TDD一起使用是很好的。 但我有一个严重的问题。在我看来,MS Fakes旨在用于以下场景:编写代码->为其编写单元测试。在使用MS Fakes进行TDD期间,如何模拟某些接口 例如,我在one文件中有以下代码(重构将在稍后完成) 在我的TDD过程中,我将所有东西都放在一个文件中,然后将重构这个文件并移动到不同的程序集。但是我需要在这里模拟内联icCustomerRepository

我将尝试TDD,我正在为此研究合适的工具。 在工作中,我们使用MS Fakes,因此不更改它并将MS Fakes与TDD一起使用是很好的。 但我有一个严重的问题。在我看来,MS Fakes旨在用于以下场景:编写代码->为其编写单元测试。在使用MS Fakes进行TDD期间,如何模拟某些接口

例如,我在one文件中有以下代码(重构将在稍后完成)

在我的TDD过程中,我将所有东西都放在一个文件中,然后将重构这个文件并移动到不同的程序集。但是我需要在这里模拟内联
icCustomerRepository customerRepository=null。例如,我可以用NSubstitute轻松完成。但如果我使用MS Fakes,我需要首先将此接口移动到另一个项目,从单元测试所在的项目引用此项目,然后按“添加假组件”。这似乎是非常复杂的工作流,这使得TDD没有那么快和高效。
我希望这样的代码不需要所有这些奇怪的操作:

ICustomerRepository customerRepository = new StubBase<ICustomerRepository>
                {
                    GetCustomers = () => Enumerable.Empty<Customer>().ToArray(),
                };
ICCustomerRepository customerRepository=new StubBase
{
GetCustomers=()=>Enumerable.Empty().ToArray(),
};

但是
StubBase
是抽象的。那么,有没有办法用MS Fakes做这样的事情呢?

Fakes依赖于构建时代码生成,目前需要您在单独的项目中定义要存根的接口/类。与其他在运行时生成存根的框架(如NSubstitute)相比,这需要在编译新测试之前执行一个额外的重构步骤——将刚创建的新接口从测试项目移动到目标项目。使用Resharper只需几次按键即可完成此重构。

冒着引发火焰之战的风险,MS套件中的大多数测试工具都是如此。简短回答:在使用这些工具时,您应该做出是否要使用它们的明智决定。如果选择“是”,则必须遵守MS对TDD或单元测试的一般定义,即使这似乎违反直觉

  • 编码的UI要求您在开始编写测试之前生成UI的映射。这要求用户界面在开始脚本测试之前完成
  • MSTest强制您编写无法共享(创建代价高昂)状态的测试,即使它们属于同一测试设备。这意味着必须反复运行昂贵的设置,以保持测试独立/并行友好
  • 有了PEX,微软承诺对已经编写的代码进行测试覆盖。。通过自动生成测试用例。然而,这与TDD没有任何关系
MS Fakes似乎要求您右键单击包含接口的程序集并生成Fakes程序集。然后学习命名约定(这对我来说有点奇怪),并将lambda表达式或委托映射到可能由代码执行的每个接口成员。我担心生成的测试不可读/重构友好

对于推荐的在抽象层(接口)后面有依赖项的情况,Rhino、Moq、NSubstitute等常见的可疑项可以正常工作,而不会妨碍您的工作。
我发现MS Fakes的唯一地方是遗留代码或第三方代码,在这些代码中,您无法访问源代码来解耦/注入依赖项。在这种情况下,MS Fakes可能很有用。

我不建议使用MS Fakes。它会妨碍您编写糟糕的测试代码,并迫使您使用xml文件。对于TDD来说,这不是一个好的测试框架阶段。罗伊·奥舍洛夫将为这一点作证,他在书中这样做了


保持简单,对吗?MS Fakes将导致您,并要求您执行相反的操作,如果您使用该工具,您将陷入混乱。

我在编写代码之前先编写测试。经过几次反复的测试->代码->重构,我发布了结果代码。
ICustomerRepository customerRepository = new StubBase<ICustomerRepository>
                {
                    GetCustomers = () => Enumerable.Empty<Customer>().ToArray(),
                };