问题:
我正在试图弄清楚是否有办法在满足特定条件时失败所有C#单元测试。
背景
我为一个对象设置单元测试,该对象对其内部数据进行编码和解码。这是一个相当人为的例子:
//A local Object with one element/item for each branch
var tree_branches_object = [
{ "branch_level": branchLevel, "BirdsOnBranch": moderate },
{ "branch_level": branchLevel, "BirdsOnBranch": low },
{ "branch_level": branchLevel, "BirdsOnBranch": low },
]
//recursive Function
function TreeFunction() {
//some test variable: Branch Level is set to 1
branchLevel = 1;
// obtain branch-info data from a server via AJAX-ish call
var childFunction = function () {
//Check for other branches
if (there_are_other_branches_in_the_tree) {
// ?!? increase the branch level ?!?
branchLevel++;
// store the current branchLevel into the tree_branches_object object
tree_branches_object.push({ "branch_level": branchLevel, "BirdsOnBranch": low });
// call TreeFunction again and obtain information for the next branch, until all branches in the three have been vizited.
}
}
我没有在每个[TestClass]
public class FooTests
{
private Foo TestFoo { get; set; }
[TestMethod]
public void DataEncodingIsWorking()
{
// TestFoo.EncodeData() ...
}
[TestMethod]
public void DataDecodingIsWorking()
{
// TestFoo.DecodeData() ...
}
public FooTests(dynamic[] data) {
TestFoo = new Foo(data);
}
}
public class Foo {
public void EncodeData() {
// encodes Foo's data
}
public void DecodeData() {
// decodes Foo's encoded data
}
public Foo(dynamic[] data) {
// feeds data to Foo
}
}
中创建TestFoo
的新实例(有点重复),而是在[TestMethod]
中创建了一个全局TestFoo
对象。如果FooTests
无法实例化,我希望失败所有TestFoo
单元测试(因为如果对象无法实例化,编码/解码将无法工作)。
这不是最佳实践的问题,但我也很好奇这种方法是否可怕。我想另一种方法是设置一个额外的单元测试,以查看FooTests
是否正确实例化。
答案 0 :(得分:7)
如何故意使所有C#单元测试失败
TL; DR:在ClassInit()
中,实例化测试所需的任何对象并添加适当的Assert
语句。如果任何条件失败,所有测试都将失败。
您可以添加一个在运行任何测试方法之前自动调用的方法,并使用ClassInitialize
属性对其进行修饰。
MSDN:
标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配要由测试类使用的资源。这个类不能被继承。
...和
在负载测试中运行时,标有此属性的方法将运行一次,并且它执行的所有初始化操作都将应用于整个测试。如果需要对测试中的每个虚拟用户迭代执行一次初始化操作,请使用TestInitializeAttribute。
在下面的示例中,我们实例化了一个新的Foo
对象,Assert
它不是null
。我们当然可以根据需要测试其他情况。
[ClassInitialize]
public void ClassInit(TestContext context)
{
TestFoo = new Foo(dynamicDataFromContext);
Assert.IsNotNull(TestFoo);
}
如果您对数据驱动的测试感兴趣,那么您可能需要签出 How To: Create a Data-Driven Unit Test
我认为CRice在此页面上Assert.Inconclusive()
提出了mylog({phone_number, name, address});
,因此您也可以选择合并mylog({phone_number: phone_number, name: name, address: address});
。
答案 1 :(得分:2)
抛出异常将导致测试失败。或者你可以调用Assert.Fail()。
在测试前置条件失败的情况下,最好使用Assert.Inconclusive()。这样你的测试就会停止(橙色)但不会失败(红色) - 没有结果的状态代表了测试前提条件未达到的情况,你永远不会断言你要测试的是什么。