如何使用MSTest/xUnit框架编写上下文/规范样式单元测试?

Cha*_*lie 23 c# bdd unit-testing mstest mspec

我一直在使用MSpec编写我的单元测试,并且更喜欢BDD风格,我认为它更具可读性.我现在正在使用MSpec不支持的Silverlight,所以我不得不使用MSTest,但仍然希望保持BDD风格,所以我想尝试一种方法来做到这一点.

只是为了解释我想要实现的目标,这就是我如何编写MSpec测试

[Subject(typeof(Calculator))]    
public class when_I_add_two_numbers : with_calculator
{
  Establish context = () => this.Calculator = new Calculator();
  Because I_add_2_and_4 = () => this.Calculator.Add(2).Add(4);
  It should_display_6 = () => this.Calculator.Result.ShouldEqual(6);
}

public class with_calculator
{
  protected static Calculator;
}
Run Code Online (Sandbox Code Playgroud)

因此,对于MSTest,我会尝试像这样编写测试(虽然你可以看到它不起作用,因为我已经输入了2个TestInitialize属性,但是你得到了我正在尝试做的...)

[TestClass]
public class when_I_add_two_numbers : with_calculator
{
   [TestInitialize]
   public void GivenIHaveACalculator()
   {
      this.Calculator = new Calculator();
   }

   [TestInitialize]
   public void WhenIAdd2And4()
   {
      this.Calculator.Add(2).Add(4);
   }

   [TestMethod]
   public void ThenItShouldDisplay6()
   {
      this.Calculator.Result.ShouldEqual(6);
   }
}

public class with_calculator
{
  protected Calculator Calculator {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以想出一些更优雅的建议来用这种方式用MSTest编写测试吗?

goe*_*ing 35

你对这个问题的看法:

[TestClass]
public class when_i_add_two_numbers : with_calculator
{
    public override void When()
    {
        this.calc.Add(2, 4);
    }

    [TestMethod]
    public void ThenItShouldDisplay6()
    {
        Assert.AreEqual(6, this.calc.Result);
    }

    [TestMethod]
    public void ThenTheCalculatorShouldNotBeNull()
    {
        Assert.IsNotNull(this.calc);
    }
}

public abstract class with_calculator : SpecificationContext
{
    protected Calculator calc;

    public override void Given()
    {
        this.calc = new Calculator();
    }
}

public abstract class SpecificationContext
{
    [TestInitialize]
    public void Init()
    {
        this.Given();
        this.When();
    }

    public virtual void Given(){}
    public virtual void When(){}
}

public class Calculator
{
    public int Result { get; private set; }
    public void Add(int p, int p_2)
    {
        this.Result = p + p_2;
    }
}
Run Code Online (Sandbox Code Playgroud)