Ham*_*359 7 c# unit-testing mspec
我们使用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...
}
Run Code Online (Sandbox Code Playgroud)
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");
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来编写我缺少的MSpec测试,因为我对MSpec还不够熟悉,或者在这种情况下MSpec真的只是错误的工具吗?
注意:团队中的另一个Dev认为我们应该在MSpec中编写所有测试,因为他不想在项目中引入多个测试框架.虽然我理解他的观点,但我想确保我们使用正确的工具来完成正确的工作,所以如果MSpec不是正确的工具,我正在寻找可以用来引入另一个框架的案例.
简短的回答,使用 NUnit 或 xunit。组合测试不是 mspec 的最佳点,而且很可能永远不会。我从不关心项目中的多个测试框架,尤其是当第二个工具更适合特定场景时。Mspec 最适合行为规范。测试输入变量则不然。