【问题标题】:Inherited test class from generic base is ignored in MSTest从通用基础继承的测试类在 MSTest 中被忽略
【发布时间】:2011-08-25 12:52:50
【问题描述】:

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

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

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

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

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

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


作为测试,我尝试在切面程序集中向继承的测试类添加一个测试,它会调用基础测试类中的所有测试。

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

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

为什么会跳过这些基本测试,以及为什么会显示“已中止”?

【问题讨论】:

  • FWIW,MSTest 在很多方面都很糟糕,甚至都不好笑。不支持 AFAIR 继承的测试类...这只是众多问题之一。
  • @Mark:你有什么建议,我应该试试 NUnit 吗?在这个特殊案例之前,我对 MSTest 非常满意,所以如果你说 NUnit 肯定能够做到这一点,我会试一试。
  • 刚刚在 Microsoft Connect 上找到 this relevant bug report
  • 我对 xUnit.net 很满意:blog.ploeh.dk/2010/04/26/… 而 Roy Osherove 似乎更喜欢 NUnit:osherove.com/blog/2010/3/5/…

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


【解决方案1】:

造成这种情况的原因与泛型无关,而是与测试位于不同的程序集中有关。

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

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

您可以通过以下方式解决此问题 编译包含的源文件 所有测试项目的基类 希望从该基础中获得 班级。将项目添加为“链接”,以便 你不会得到多个 基础源文件的副本 类。

这对我有用,我不觉得解决方法太难看。

【讨论】:

【解决方案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 能解决这个问题....

【讨论】:

    【解决方案3】:

    Steven 将基类源文件添加为链接然后将其编译到测试 dll 中的答案也对我有用。

    然而,从 VS 2013 Update 2 开始,现在有了“共享项目”的概念,这是一种将源代码从另一个项目中提取到您的项目中,然后将它们编译为一个项目的方法。

    这就是我所做的

    1. 创建新的“共享项目”项目
    2. 将当前测试基类(和其他需要的文件)移动到共享项目中
    3. 从您的测试项目中添加对共享项目的引用(更多内容见下文)
    4. 编译、测试,尽情享受

    至少在 VS2015 Update 2 上,第 3 步并不像我认为的那样简单。根据this answer Visual Studio 并没有为您提供一种将共享项目链接到测试项目的简单方法(如图...)。这是我必须做的:

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

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

    5. 重新加载项目

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多