【问题标题】:TDD with MS Fakes带有 MS 假货的 TDD
【发布时间】:2012-11-17 21:40:00
【问题描述】:

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

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

[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&lt;&gt; 是抽象的。那么有没有办法用 MS Fakes 做这样的事情呢?

【问题讨论】:

  • 我在写代码之前写测试。经过几次测试 -> 代码 -> 重构后,我发布了结果代码。

标签: unit-testing tdd microsoft-fakes


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 2011-04-29
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        相关资源
        最近更新 更多