有没有办法指示MsTest何时运行测试方法?

时间:2012-05-28 11:05:42

标签: c# unit-testing mstest

是否有一种方法或方法,如方法装饰器或测试方法的属性,例如:

“在运行方法B之前运行方法C”

所以基本上你是在C和B之间创建一个依赖。我知道测试最好是原子的,应该是但有时候最好让你的测试保持小而且重要。当它正在寻找的项目根本就不存在时,运行“RemoveItem”测试方法是有意义的。

大多数人会事先添加该项目,然后进行测试以确定他们是否可以删除 - “ 所有在同一测试中 ”。我不喜欢这种方法,并且希望让我的测试更小,更多,以达到更好的点和更原子。

2 个答案:

答案 0 :(得分:1)

就像你说的那样,你不希望你的测试之间存在相互依赖关系。如果您不习惯在删除测试中的“删除”之前添加“添加”,从而在错误的位置测试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();
  }  

}

答案 1 :(得分:1)

如果您需要在测试删除之前添加一些项目,那么添加项目的最佳位置是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           
    }
}