bdd - 这个 MSpec 测试可以改进吗?

标签 bdd mspec

作为 BDD 和 MSpec 的初学者,我仍然不太确定与 BDD 相关的最佳实践和良好习惯,尤其是与 MSpec 相关的最佳实践。

下面的例子可以改进吗?它是否遵循最佳实践和良好习惯?

  1. 我的规范类和行为的命名是否正确?
  2. 我应该在这种情况下使用行为还是应该为规范类使用通用基类?
  3. 这里可以不设置 Establish 吗?
  4. 我应该使用静态工厂方法(TestData 方法)获取测试数据还是应该在规范本身中创建数据?
  5. 我可以使用 result.Equals() 而不是测试行为中的每个属性,但我会测试两件事,这不太好,对吧?

请随时将示例重构为您认为更好的内容。

[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_stream
{
    Because of = () =>
    {
        using (var reader = new DataItemReader(
            new MemoryStream(TestData.GetNormalDataItemAsByteArray()), Encryption.None))
        {
            result = reader.ReadItem();
        }
    };

    Behaves_like<DataItemReader_that_reads_correctly> behavior;

    protected static DataItem result;
}

[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_encrypted_stream
{
    Because of = () =>
    {
        using (var reader = new DataItemReader(
            new MemoryStream(TestData.GetNormalDataItemAsByteArrayEncyrpted()), Encryption.Default))
        {
            result = reader.ReadItem();
        }
    };

    Behaves_like<DataItemReader_that_reads_correctly> behavior;

    protected static DataItem result;
}

[Behaviors]
public class DataItemReader_that_reads_correctly
{
    protected static DataItem result;

    It should_read_the_correct_DataItem = () =>
    {
        var testItem = TestData.GetNormalDataItem();
        result.Property1.ShouldEqual(testItem.Property1);
        result.Property2.ShouldEqual(testItem.Property2);
        result.Property3.ShouldEqual(testItem.Property3);
    };
}

最佳答案

这可能不是世界对规范的看法,而是您和您的团队/同行/“必须在您之后阅读此代码的人”可以从中获益。

从一个开发者的角度来看:

  1. 我的大小写和命名遵循代码中可读的内容。 HTML 摘录的好处是您最终会获得可读的规范。我读过的很多内容都集中在所有小写字母等方面;但是,我的措辞与您的非常相似:适当、可读的大小写。

  2. 对于像这样的一对一,行为对于可读性非常好。我使用基类来建立上下文,并为重复的、常见的断言设置期望和行为。

  3. Establish 一直意味着“在我测试之前设置环境”。在你的两个例子中,我可能会像这样重写它:

    Establish context = () => var reader = 
           new DataItemReader(new MemoryStream(     
           TestData.GetNormalDataItemAsByteArray()),                               
           Encryption.None));
    
    Because of = () => result = reader.ReadItem();
    
    Cleanup after = () => reader.Dispose();
    

    由于规范关注的是“读取”的 DataItem,因此操作或 Because 就是这样。同样,偏好问题。

  4. 我使用可重复使用的静态工厂,我在其中手工创建了 stub 或具有 stub /模拟引擎(如 FakeItEasy http://code.google.com/p/fakeiteasy/ )。在我看来, stub 的内容/创建对实际测试影响不大, stub 应该被视为某种程度上的黑盒(这就是我们编写测试的原因,对吧?)。

  5. 我会单独关注每个属性(如您所拥有的那样),以确保它们符合我的期望。如果您曾经覆盖 Equals,您可能会检查不属于规范或不相关的属性的相等性。

我不确定是否存在任何管理“最佳实践”(github 站点上有一些提示:https://github.com/machine/machine.specifications#readme)。通过查看其他使用 MSpec 的项目并观察他们如何处理他们的规范,我发现我的一些编码风格发生了变化。

关于bdd - 这个 MSpec 测试可以改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999746/

相关文章:

Cucumber:引用/不引用参数的最佳实践是什么

xpath - 测试自动化框架提供了哪些我使用 Selenium Webdriver 编写脚本的方法没有提供的功能?

c# - BDD 和 nSpec 入门

java - 具有两个不同类的 Cucumber DataTable

asp.net-mvc - 如何在 ASP.NET MVC 中以 BDD 风格进行单元和集成测试?

unit-testing - 如何将 "full stack"功能分解为验收、集成和单元测试?

c# - Specflow 的可选参数

macos - 如何在 MonoDevelop/Xamarin Studio 中调试 MSpec 测试?

unit-testing - 如何在 MSpec 中使用 It 断言输出消息

c# - 如何在 STAThread 模式下使用 resharper runner 运行 mspec