这是一个干净的BDD / MSpec测试吗?

时间:2012-02-21 14:37:11

标签: unit-testing bdd mspec

我有一个静态类Cryptographic,可以EncyptDecrypt一个字符串。我已经为此写了以下规范:

[Subject(typeof(Cryptographic))]
class When_encrypting_and_decrypting_a_string
{
    Establish context = () => { input = "teststring"; };

    Because of = () =>
    {
        output = Cryptographic.Decrypt(Cryptographic.Encrypt(input));
    };

    It should_decrypt_what_was_encrypted = () => input.ShouldEqual(output);

    static string input;
    static string output;
}

[Subject(typeof(Cryptographic))]
class When_encrypting_and_decrypting_an_empty_string
{
    Establish context = () => { input = string.Empty; };

    Because of = () =>
    {
        output = Cryptographic.Decrypt(Cryptographic.Encrypt(input));
    };

    It should_decrypt_what_was_encrypted = () => input.ShouldEqual(output);

    static string input;
    static string output;
}

[Subject(typeof(Cryptographic))]
class When_encrypting_and_decrypting_a_null_string
{
    Establish context = () => { input = null; };

    Because of = () =>
    {
        output = Cryptographic.Decrypt(Cryptographic.Encrypt(input));
    };

    It should_decrypt_what_was_encrypted = () => input.ShouldEqual(output);

    static string input;
    static string output;
}

这是一个干净的BDD单元测试吗?有什么可以改进的吗? 我方面的一些担忧:

  1. 我可能会在这里测试两件事,我实际上应该测试一下 一。我在Encrypt中同时拥有DecryptBecause
  2. 测试涉及大量复制和粘贴,所有测试仅因输入参数而不同。也许可以或应该改进这一点 通过使用某种行测试,或公共基类或 而是Behaves条款?我的意思是可读性现在非常理想 但可维护性不是。如果我优化可维护性(DRY)我 可能会以可读性进行交易。
  3. 你会如何为此编写测试/规格?

1 个答案:

答案 0 :(得分:1)

这个单元测试看起来是一个很好的起点。我想知道如果我实施EncryptDecrypt以便它只返回其各自的input,它是否会中断。目前,没有必要加密任何让我想知道测试或生产代码是否已经首先编写的东西。

作为一般规则,如果您需要测试输入和输出对,我建议您查看NUnit的TestCase等。人。 BDD作为一种工具尤其有意义,但并不仅限于指定系统行为。您在这里介绍的是一个不与系统的任何其他部分交互的单个类。虽然我理解BDD和上下文/规范风格可能有助于表达预期的单元行为,但有时经典单元测试框架更有意义。如果您需要对输入和输出元组进行测试运行,则尤其如此。