是否有一种方法或方法,例如测试方法的方法装饰器或属性,例如:
“在运行方法 B 之前运行方法 C”
所以基本上你是在 C 和 B 之间创建依赖关系。我知道测试最好是原子的,应该是原子的,但有时最好保持你的测试小而重要。当它正在寻找的项目根本不存在时,不运行“RemoveItem”测试方法是有意义的。
大多数人会事先添加该项目,然后测试他们是否可以删除 - ' All In the same test '。我不喜欢这种方法,我想让我的测试更小、更准确、更原子化。
是否有一种方法或方法,例如测试方法的方法装饰器或属性,例如:
“在运行方法 B 之前运行方法 C”
所以基本上你是在 C 和 B 之间创建依赖关系。我知道测试最好是原子的,应该是原子的,但有时最好保持你的测试小而重要。当它正在寻找的项目根本不存在时,不运行“RemoveItem”测试方法是有意义的。
大多数人会事先添加该项目,然后测试他们是否可以删除 - ' All In the same test '。我不喜欢这种方法,我想让我的测试更小、更准确、更原子化。
就像您说的那样,您不希望测试之间存在相互依赖关系。如果您不习惯在删除测试中在“删除”之前添加“添加”,从而在错误的位置测试 Add 方法,那么我建议使用 testInitialize 来设置测试可以作用的一些对象。然而,我推荐在运行 Remove 之前实际运行 Add 的做法,在 Remove 的测试中。
[Testclass]
public class TestStacks
{
private Stack<string> emptyStack;
private Stack<string> singleItemStack;
[TestInitialize]
public void Setup()
{
singleItemStack = new Stack<string>();
singleItemStack.Push("Item");
emptyStack = new Stack<string>();
}
[TestMethod]
public void TestPush()
{
emptyStack.Push("Added");
Assert.AreEqual(1, emptyStack.Count);
}
[TestMethod]
public void TestRemove()
{
singleItemStack.Pop();
Assert.AreEqual(0, singleItemStack.Count);
}
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void TestPopFromEmpty()
{
emptyStack.Pop();
}
}
如果您需要在测试移除之前添加一些项目,那么添加项目的最佳位置是arrange
移除测试的一部分。这将使移除测试的上下文变得清晰。
但 DRY 原则也适用于此 - 您可以将添加逻辑移动到单独的辅助方法。然后调用它两次 - 在测试添加时,以及在安排删除上下文时:
[Testclass]
public class Tests
{
[TestMethod]
public void TestAddition()
{
AddItem();
// Assert addition
}
[TestMethod]
public void TestRemoval()
{
AddItem();
// Remove item
// Assert removal
}
private void AddItem()
{
// Add item
}
}