Do you use TestInitialize or the test class constructor to prepare each test? and why?

后端 未结 10 669
梦毁少年i
梦毁少年i 2020-12-02 15:35

This question regards unit testing in Visual Studio using MSTest (this is important, because of MSTest\'s execution order). Both the method marked [TestInitialize] and the t

10条回答
  •  無奈伤痛
    2020-12-02 15:48

    The constructor is just a structure provided by the language. Every test framework seems has its own controlled lifecycle "initialize". You'll probably only get into trouble using the constructor to mutate your locals.

    MSTest: You get an entire new instance of the test class for every TestMethod. This might be the only case where it's ok to mutate your locals in the constructor, initializer, or test method and not affect the other test methods.

    public class TestsForWhatever
    {
        public TestsForWhatever()
        {
            // You get one of these per test method, yay!
        }
    
        [TestInitialize] 
        public void Initialize() 
        {
            // and one of these too! 
        }
    
        [TestMethod]
        public void AssertItDoesSomething() { }
    
        [TestMethod]
        public void AssertItDoesSomethingElse() { }
    }
    

    MSpec: You only get one Establish and Because for all your assertions (It). So, don't mutate your locals in your assertions. And don't depend on mutations of locals in base contexts (if you use them).

    [Subject(typeof(Whatever))]
    public class When_doing_whatever
    {
        Establish context = () => 
        { 
            // one of these for all your Its
        };
    
        Because of = () => _subject.DoWhatever();
    
        It should_do_something;
        It should_do_something_else;
    }
    

提交回复
热议问题