在MSTest中忽略来自泛型基类的继承测试类

时间:2011-05-14 14:24:07

标签: c# visual-studio unit-testing mstest resharper-5.1

在MSTest中创建通用基础测试类并从中继承时,我无法运行所有继承类的测试。

Unit test results

BaseDependencyPropertyFactoryTest 位于 Whathecode.PresentationFramework.Tests 程序集中。它是通用基类。 ( BaseDependencyPropertyFactoryTest< TTestClass>

两个程序集都有一个继承自此基类的测试,称为 DependencyPropertyFactoryTest 。所有继承的类都传递一个特定的类型参数。

[TestClass]
public class DependencyPropertyFactoryTest
    : BaseDependencyPropertyFactoryTest<ASpecificClass>
{
}

只有与基类位于同一程序集中的继承测试才会运行。 Whathecode.PresentationFramework.Aspects.Tests 程序集中的继承测试似乎完全被忽略。

我做错了什么?如果需要,我可以上传所有必需的源代码,但是你需要PostSharp来进行方面组装。


作为测试,我尝试在aspect程序集中添加一个测试,该测试类调用基本测试类中的所有测试。

[TestMethod]
public void AllBaseTests()
{
    ClrGetterSetterTest();
    DependencyPropertyGetterSetterTest();
}

这给出了以下结果。奇怪的是,这个测试被执行了!现在,这可能是一种至少运行它们的方法,但当然每次在基类中添加额外的测试时我都不想编辑这个测试。

Unit test results after edit

为什么跳过这些基础测试,为什么指示'已中止'?

4 个答案:

答案 0 :(得分:13)

原因与泛型有关,但测试在不同的程序集中。

Microsoft Connect建议描述了问题:"Visual Studio Test (MSTest) and lack of Inheritance support for base classes that resides in different assemblies."它被标记为“已修复”,但似乎尚未在Visual Studio 2010中修复,可能仍需要发布?

这个问题有一个有趣的解决方法:

  

你可以解决这个问题   编译包含的源文件   基类进入所有测试项目   希望从那个基础派生出来的   类。将项目添加为“链接”   你最终没有多个   基础的源文件的副本   类。

这对我有用,而且我觉得这种解决方法太难看了。

答案 1 :(得分:2)

没什么特别的,但通过调用基本方法解决问题的另一种方法是:

public abstract class AccountBaseTest
{
    protected abstract IAccountRepository GetAccountRepository();

    public void _submitAccountToLMS_BlankAccount_NewLmsID()
    {
       Account account = new Account(GetAccountRepository());
       account.FirstName = Faker.FirstName();
       account.LastName = Faker.LastName();
       account.SubmitToLms();
       Assert.IsTrue(account.LmsID > 0);
    }
}



[TestClass]
public class AccountIntegrationTest
{
    protected override IAccountRepository GetAccountRepository()
    {
        return new AccountRepository();
    }

    [TestMethod]
    public void SubmitAccountToLMS_BlankAccount_NewLmsID()
    {
       base._submitAccountToLMS_BlankAccount_NewLmsID();
    }
}

希望VS 2012能解决这个问题......

答案 2 :(得分:2)

Steven的回答是将基类源文件添加为链接,然后将其编译到测试dll中。

然而,从VS 2013 Update 2开始,现在有了一个共享项目的概念&#34;这是一种将源代码从另一个项目中提取到项目中然后将其编译为一个的想法。

这就是我做的事情

  1. 创建新的&#34;共享项目&#34;项目
  2. 将当前测试基类(和其他所需文件)移动到共享项目中
  3. 在测试项目中添加对共享项目的引用(详见下文)
  4. 编译,测试并快乐
  5. 至少在VS2015 Update 2上,第3步并不像我想的那样直截了当。 Per this answer Visual Studio并没有为您提供一种将共享项目链接到测试项目的简便方法(如图...)。这就是我必须要做的事情:

    1. 卸载.csproj文件,
    2. 右键单击并编辑.csproj文件
    3. 一直到底部并将其添加到<Import ...>分组的开头(根据需要修复路径和名称,确保添加Label="Shared"!):

      <Import Project="..\SharedProject\SharedProject.projitems" Label="Shared" />
      
    4. 保存并关闭文件

    5. 重新加载项目

答案 3 :(得分:0)