Inherited test class from generic base is ignored in MSTest

断了今生、忘了曾经 提交于 2019-11-30 17:17:36

The cause of this doesn't have to do with generics, but with the tests being in different assemblies.

A Microsoft Connect suggestion describes the problem: "Visual Studio Test (MSTest) and lack of Inheritance support for base classes that resides in different assemblies." It is marked as 'fixed', but doesn't seem to be fixed in Visual Studio 2010 yet, perhaps it still needs to be released?

There is one interesting workaround to this problem:

You can work around this problem by compiling the source file containing the base class into all test projects that wish to derive from that base class. Add the item as a "link" so that you don't end up with multiple copies of the source file for the base class.

This worked for me, and I don't find the workaround too ugly.

Nothing special, but another way of solving the problem by calling base methods is:

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();
    }
}

Hopefully VS 2012 will fix this problem....

Matt Klein

Steven's answer of adding the base class source file as a link and then compiling it into the test dll worked for me as well.

However, starting in VS 2013 Update 2 there is now a concept of a "Shared Project" which is a way to formalize the idea of pulling in source code from another project into your project and then compiling them as one.

Here's what I did

  1. Create new "Shared Projects" project
  2. Move current test base class (and other needed files) into the shared project
  3. Add a reference to the shared project from your test project (more on this below)
  4. Compile, test, and be merry

At least on VS2015 Update 2, step 3 isn't as straight forward as I think it should be. Per this answer Visual studio doesn't provide you an easy way to link shared projects to test projects (go figure...). This is what I had to do:

  1. Unload the .csproj file,
  2. Right-click and edit the .csproj file
  3. Go all the way to the bottom and add this to the start of the <Import ...> grouping (fix path and name as needed, make sure to add Label="Shared"!):

    <Import Project="..\SharedProject\SharedProject.projitems" Label="Shared" />
    
  4. Save and close the file

  5. Reload the project
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!