4

我们有一个共享的基本接口public interface IOperation {...}和许多(数十个,很快 100 多个)不同的对象来实现IOperation.

我们还对所有这些实现进行了测试,所有这些都继承自调用的基类,这些基类使用实际操作类和此类操作TestOperationCommon 的 Create 方法的类型进行模板化。new我们有 TestOperationCommon 的实现,最多有五个模板参数(这对于所有操作来说已经足够了)。

现在,最近决定将所有操作实现都放在内部并且只IOperation公开,这似乎是一个好主意,因为这些操作是实现细节。通过[InternalsVisibleTo(...)]测试似乎也解决了。

但是,现在我看到我们不能再使用我们的测试结构了,因为公共测试类的通用参数现在是内部的(至少被测试的实际类是内部的),这导致

Inconsistent Accessibility .... less accessible than ...

错误。在下面的代码中,公共测试类不能从具有内部通用参数 T 的 TestOperationCommon 继承。但是将所有这些共享行为测试复制到特定测试中似乎也是一个坏主意。

  • 有没有办法让 vstest 框架(VS2013+)来测试[TestClass]内部的 es?

  • 还是有另一种方法可以保留共享测试而不必复制大量代码?

  • 还是我们做错了(使那些“实现细节类”成为内部的)?

代码示例作为评论中的请求:

public interface IOperation { ... }

internal class SomeOperation : IOperation 
{
    public SomeOperation(A a, B b, C c) {...}
}


public abstract TestOperationCommon<T, A, B, C> 
    where T : IOperation
    where ...
{
    protected abstract T Create(A a, B b, C c);

    [TestMethod]
    public void TestCommonOperationBehavior()
    {
        var op = Create(Mock.Of<A>(), Mock.Of<B>(), Mock.Of<C>);
        ...
    }
}

[TestClass]
public class TestSomeOperation : TestOperationCommon<SomeOperation, ...>
{
    [TestMethod]
    public void TestSpecificSomeOperationStuff() {}

}
4

1 回答 1

1

你能创建一个测试包装类吗?

就像是:

[TestClass]
public class AnnoyingTestSomeOperationWrapper
{

    [TestMethod]
    public void TestSpecificSomeOperationStuff() 
    {
        new TestSomeOperation().TestSpecificSomeOperationStuff()
    }

}

internal class TestSomeOperation : TestOperationCommon<SomeOperation, ...>
{
    public void TestSpecificSomeOperationStuff() {}

}
于 2015-08-14T16:54:21.260 回答