首页 > 解决方案 > 在 MSTest 中使用继承进行共享测试

问题描述

我正在尝试为 D365 插件和 CodeActivities(都是类)编写单元测试。每个插件都应该运行一些小测试,例如:

[TestMethod]
public void NullLocalPluginContext()
{
    XrmFakedContext context = new XrmFakedContext();

    Assert.ThrowsException<InvalidPluginExecutionException>(
        () => context.ExecutePluginWith<SomePlugin>(null));
}

要测试的类在哪里SomePlugin(每个孩子不同)并且不能是抽象的(等待IPlugin)。例如这里它是一个CheckDuplicateOrder在孩子:

[TestClass]
public class CheckDuplicateOrderTest
{
    [TestMethod]
    public void NullLocalPluginContext()
    {
        XrmFakedContext context = new XrmFakedContext();

        Assert.ThrowsException<Exception>(
            () => context.ExecutePluginWith<CheckDuplicateOrder>(null));
    }
}

对于这些小测试,我想让这个父母使用共享测试,但我不知道如何引用“未来”孩子的目标。我更喜欢 MSTest,但任何 NuGet 框架都可以接受。

也许这有助于理解

每个插件都有自己的测试类。每个插件测试类都需要基本的。这些基本测试应该从父级继承(所以它们不占用空间)。

插件:Dog、Cat、Mouse PluginTests:DogTest、CatTest、MouseTest BasePluginTest -> 应该有共享测试,SomePlugin例如 Dog/Cat/Mouse。但我不知道如何引用它。每个插件都有一个功能TestWalk() { .. ExecutePluginWith<SomePlugin>}。Cat 应该调用 CatTest,Dog 应该调用 DogTest。

标签: c#unit-testingdynamics-crmmstest

解决方案


与普通类一样,您应该更喜欢组合而不是继承。即使测试类不必遵循与普通类相同的规则和准则,但这并不意味着我们不能实现它们。

因此,当您觉得您的测试类中有一些通用功能时,您应该提取一些测试使用的类。对于普通的商务舱,您也会这样做,不是吗?

class CommonFunc 
{ 
    public static bool NullLocalPluginContext<T, TException>() where T: IPlugIn, TException : Exception
    {
        XrmFakedContext context = new XrmFakedContext();
        try { context.ExecutePluginWith<T>(null)) };
        catch (T e) { return true; }
        return false;
    }
}

[TestClass]
public class CheckDuplicateOrderTests
{
    [TestMethod]
    public void NullLocalPluginContext()
    {
        Assert.IsTrue(CommonFunc.NullLocalPluginContext<CheckDuplicateOrder, Exception>(null));
    }
}

[TestClass]
public class SomeOtherPluginTests
{
    [TestMethod]
    public void NullLocalPluginContext()
    {
        Assert.IsTrue(CommonFunc.NullLocalPluginContext<SomePlugin, InvalidPluginExecutionException>(null));
    }
}

你也可以让你的通用方法重新抛出异常,而不是仅仅返回true,或者false如果你想记录在测试框架中抛出的实际异常。


推荐阅读