18

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

单元测试结果

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

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

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

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

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


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

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

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

编辑后的单元测试结果

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

4

4 回答 4

13

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

Microsoft Connect 建议描述了该问题:“Visual Studio 测试 (MSTest) 和缺乏对驻留在不同程序集中的基类的继承支持。” 它被标记为“已修复”,但在 Visual Studio 2010 中似乎还没有修复,也许还需要发布?

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

您可以通过将包含基类的源文件编译到希望从该基类派生的所有测试项目中来解决此问题。将该项目添加为“链接”,这样您就不会得到基类源文件的多个副本。

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

于 2011-05-15T11:43:15.433 回答
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 能解决这个问题....

于 2011-11-14T23:03:40.100 回答
2

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

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

这就是我所做的

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

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

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

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

  5. 重新加载项目
于 2016-06-08T22:18:18.703 回答