Internals, InternalsVisibleTo和testing共享行为

本文关键字:共享 testing InternalsVisibleTo Internals | 更新日期: 2023-09-27 18:08:10

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

我们还对所有这些实现进行了测试,所有这些实现都继承自称为TestOperationCommon的基类,这些基类被模板化为new这样一个操作的创建方法的实际操作类和类型。我们有TestOperationCommon的实现,有一个到五个模板参数(这对所有操作都足够了)。

现在,最近决定使所有的操作实现内部,只有IOperation是公共的,这似乎是一个好主意,因为这些操作是实现细节。有了[InternalsVisibleTo(...)],测试似乎也解决了。

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

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

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

  • 是否有一种方法可以获得最测试框架(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() {}
}

Internals, InternalsVisibleTo和testing共享行为

您可以创建一个测试包装器类吗?

类似:

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