3

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

例如,我在一个文件中有以下代码(稍后将进行重构)

[TestClass]
public class MyTests
{
    [TestMethod]
    public void ShouldReturnSomeResultIfEmptyCollectionOfCustomersWasReturned()
    {
        // arrange
        ICustomerRepository customerRepository = null;
        var targetService = new MyTargetService(customerRepository);

        // act
        int result = targetService.MyMethod();

        // assert
        Assert.AreEqual(1, result);

    }
}

public class MyTargetService : IMyTargetService
{
    private readonly ICustomerRepository customerRepository;

    public MyTargetService(ICustomerRepository customerRepository)
    {
        this.customerRepository = customerRepository;
    }

    public int MyMethod()
    {
        if (customerRepository.GetCustomers().Any())
        {
            return 0;
        }

        return 1;
    }
}

public interface IMyTargetService
{
}

public interface ICustomerRepository
{
    Customer[] GetCustomers();
}

public class Customer
{
}

在我的 TDD 过程中,我将所有内容都放在一个文件中,然后将对其进行重构并移至不同的程序集。但我需要在这个地方模拟内联ICustomerRepository customerRepository = null;。例如,我可以使用 NSubstitute 轻松完成。但是,如果我使用 MS Fakes,我首先需要将此界面移动到另一个项目,请从单元测试所在的项目中引用该项目,然后按“添加假程序集”。这似乎是非常复杂的工作流程,这使得 TDD 变得不那么快速和高效。我希望在没有所有这些奇怪操作的情况下就可以编写这样的代码:

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

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

4

3 回答 3

4

冒着引发一场激烈战争的风险,这对于 MS 套件中的大多数测试工具都是如此。简短回答:使用这些工具时,您应该就是否要使用它们做出明智的决定。如果您选择“是”,则您必须总体上遵守 MS 对 TDD 或单元测试的定义——即使它看起来违反直觉。

  • 编码 UI 要求您在开始编写测试之前生成 UI 地图。这要求您在开始编写脚本测试之前完成 UI。
  • MSTest 强制您编写无法共享(创建成本高)状态的测试,即使它们属于同一个测试夹具。这意味着必须一遍又一遍地运行昂贵的设置以保持测试独立/并行友好。
  • 借助 PEX,MS 承诺通过自动生成测试用例对已经编写的代码进行测试覆盖。然而,它与 TDD 没有任何关系。

MS Fakes 似乎规定您需要右键单击包含您的接口的程序集并生成一个 Fakes 程序集。然后学习命名约定(这对我来说似乎有点奇怪)并将 lambda 表达式或委托映射到您的代码可能使用的每个接口成员。我担心结果测试不可读/重构友好。

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

于 2012-11-20T12:45:25.920 回答
1

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

于 2012-11-19T16:49:58.697 回答
1

我不建议使用 MS Fakes。它会妨碍您并导致您编写糟糕的测试代码,并迫使您使用 xml 文件。对于 TDD 来说,这不是一个好的测试框架时期。罗伊·奥舍罗夫(Roy Osherove)会为此作担保,他在书中做了。

保持简单对吗?MS Fakes 会导致您并要求您做相反的事情,如果您使用该工具,您最终会一团糟。

于 2016-08-23T03:40:52.297 回答