【问题标题】:Visual studio unit test for different implementation of interface不同接口实现的Visual Studio单元测试
【发布时间】:2010-11-16 22:17:09
【问题描述】:

我需要对一个特定接口的两个实现类进行单元测试。单元测试类是通用的,涵盖了接口的所有必要测试。我想在测试单元类 TestInitialize 方法中实例化实现类。

有什么办法可以强制测试类使用不同的实现类实例运行两次。

[TestClass]
public class MyFixture
{
    [TestInitialize()]
    public void MyTestInitialize()
    {
        ITest mockInstance = new TestImplement1();
        //ITest mockInstance = new TestImplement2();
    }

    [TestMethod]
    public void Test1 ()
    {
        mockInstance.Func1();
        ...  
    }

    [TestMethod]
    public void Test2 ()
    {
        ...  
    }

    ...other unit tests

 }

【问题讨论】:

  • 必须测试这样的东西表明您的设计存在问题。被测代码不应该关心接口的具体实现者实际存在;如果是这样,你的界面违反了 LSP。
  • 或者表示他想要一种方便的方法来测试一个接口的多个实现。

标签: c# visual-studio unit-testing


【解决方案1】:

对于这种模式,通常您将拥有一个带有测试方法的基测试类,然后您将对其进行子类化并填写 setup 方法。所以它会变成这样:(我使用 NUnit,所以如果测试框架方法有点不对,我很抱歉)

// don't mark this one as TestClass!
public abstract class MyBaseFixture
{
    protected ITest mockInstance;

    [TestMethod]
    public void Test1 ()
    {
        Assert(this.mockInstance.Func1() == 0);
    }
}

[TestClass]
public class MyConcreteFixture : MyBaseFixture
{
    [TestInitialize]
    public void Setup()
    {
        this.mockInstance = new ConcreteInstance1();
    }
}    

[TestClass]
public class MyOtherConcreteFixture : MyBaseFixture
{
    [TestInitialize]
    public void Setup()
    {
        this.mockInstance = new ConcreteInstance2();
    }
}

【讨论】:

  • 顺便说一句,如果“mockInstance”是测试的主题,请不要称“mock”,因为“mock”在单元测试中是有固定含义的。
  • 谢谢马克,这就是我要找的。​​span>
  • Visual Studio 的小问题:“TestMethodAttribute 只能在标有 TestClass 属性的类中定义。”
  • @anyoneis 所说的是否意味着这在 Visual Studio 中是不可能的?
  • 不,只是你必须将抽象类标记为[TestClass]。否则,这工作得很好!
【解决方案2】:

你应该看看 Greg Young 的 interface invariant NUnit 插件:https://github.com/gregoryyoung/grensesnitt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2014-10-07
    • 2016-10-30
    相关资源
    最近更新 更多