C# MSpec是否支持;行测试“;还是数据驱动测试,比如NUnit测试用例?

C# MSpec是否支持;行测试“;还是数据驱动测试,比如NUnit测试用例?,c#,unit-testing,mspec,C#,Unit Testing,Mspec,我们正在使用Machine.Specification作为我当前项目的测试框架。这对于我们正在测试的大部分内容都很有效。然而,我们有许多视图模型,其中我们有“格式化”属性,这些属性获取一些原始数据,应用一些逻辑,并返回该数据的格式化版本 由于格式化中涉及逻辑(空检查、零的特殊情况等),我想测试一些可能的数据值,包括边界条件。对我来说,这似乎不是MSpec的正确用例,我们应该深入到NUnit这样的东西中,在那里我可以使用[TestCase]属性之类的东西编写数据驱动的测试 有没有一种干净、简单的方

我们正在使用Machine.Specification作为我当前项目的测试框架。这对于我们正在测试的大部分内容都很有效。然而,我们有许多视图模型,其中我们有“格式化”属性,这些属性获取一些原始数据,应用一些逻辑,并返回该数据的格式化版本

由于格式化中涉及逻辑(空检查、零的特殊情况等),我想测试一些可能的数据值,包括边界条件。对我来说,这似乎不是MSpec的正确用例,我们应该深入到NUnit这样的东西中,在那里我可以使用[TestCase]属性之类的东西编写数据驱动的测试

有没有一种干净、简单的方法可以在MSpec中编写此类测试,或者我认为我们应该为此类测试使用不同的工具,这是对的

查看模型

public class DwellingInformation
{        
    public DateTime? PurchaseDate { get; set; }
    public string PurchaseDateFormatted
    {
        if(PurchaseDate == null)
            return "N/A";

        return PurchaseDate.Value.ToShortDateString();
    }

    public int? ReplacementCost { get; set; }
    public string ReplacementCostFormatted
    {
        if(ReplacementCost == null)
            return "N/A";

        if(ReplacementCost == 0)
            return "Not Set";

        return ReplacementCost.ToString("C0");
    }

    // ... and so on...
}
MSpec测试

public class When_ReplacementCost_is_null
{
    private static DwellingInformation information;

    Establish context = () =>
    {
        information = new DwellingInformation { ReplacementCost = null };
    };

    It ReplacementCostFormatted_should_be_Not_Available = () => information.ReplacementCostFormatted.ShouldEqual("N/A");
}

public class When_ReplacementCost_is_zero
{
    private static DwellingInformation information;

    Establish context = () =>
    {
        information = new DwellingInformation { ReplacementCost = "0" };
    };

    It ReplacementCostFormatted_should_be_Not_Set = () => information.ReplacementCostFormatted.ShouldEqual("Not Set");
}

public class When_ReplacementCost_is_a_non_zero_value
{
    private static DwellingInformation information;

    Establish context = () =>
    {
        information = new DwellingInformation { ReplacementCost = 200000 };
    };

    It ReplacementCostFormatted_should_be_formatted_as_currency = () => information.ReplacementCostFormatted.ShouldEqual("$200,000");
}
NUnit w/TestCase

[TestCase(null, "N/A")]
[TestCase(0, "Not Set")]
[TestCase(200000, "$200,000")]
public void ReplacementCostFormatted_Correctly_Formats_Values(int? inputVal, string expectedVal)
{
    var information = new DwellingInformation { ReplacementCost = inputVal };
    information.ReplacementCostFormatted.ShouldEqual(expectedVal);
}
有没有更好的方法来编写MSpec测试,而我之所以没有,是因为我对MSpec还不够熟悉,还是在这种情况下MSpec真的是一个错误的工具


注意:团队中的另一位开发人员认为我们应该用MSpec编写所有测试,因为他不想在项目中引入多个测试框架。虽然我理解他的观点,但我想确保我们在正确的工作中使用了正确的工具,因此,如果MSpec不是正确的工具,我正在寻找可以用来论证引入另一个框架的理由的观点。

简短回答,使用NUnit或xunit。组合测试不是mspec的最佳选择,也可能永远不会。我从不关心项目中的多个测试框架,尤其是当第二个工具更适合于特定场景时。Mspec最适用于行为规范。测试输入变量并非如此。

我读到的“我从不关心多个测试框架”是指“我从不介意多个测试框架”,因为这句话在其他方面毫无意义。如果需要大量的参数化,我同意你的评估。然而,对于给定的示例,我发现将每个场景表示为离散规范更有价值。如果有100个变体,请使用便于参数化的框架。如果您只有问题中的几个,请使用上下文/规范。是的,Mind更适合。英语不是我的母语。