簡體   English   中英

在 MSTest 中使用 inheritance 進行共享測試

[英]Use inheritance in MSTest for shared tests

我正在嘗試為 D365 插件和 CodeActivities(都是類)編寫單元測試。 每個插件都應該運行一些小測試,例如:

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

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

其中SomePlugin是要測試的 class (每個孩子都不同)並且不能是抽象的(等待IPlugin )。 例如,這里是孩子的CheckDuplicateOrder

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

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

對於這些小測試,我想讓這個父母使用共享測試,但我不知道如何引用“未來”孩子的目標。 我更喜歡 MSTest,但任何 NuGet 框架都可以接受。

也許這有助於理解

每個插件都有自己的測試 class。 每個插件測試 class 都需要基礎。 這些基本測試應該從父級繼承(所以它們不占用空間)。

插件:Dog、Cat、Mouse PluginTests:DogTest、CatTest、MouseTest BasePluginTest -> 應該有共享測試,其中示例中的SomePlugin是 Dog/Cat/Mouse。 但我不知道如何引用它。 每個插件都會有一個 function TestWalk() {.. ExecutePluginWith<SomePlugin>} Cat 應該調用 CatTest,Dog 應該調用 DogTest。

與普通的 class 一樣,您應該更喜歡組合而不是 inheritance。 即使測試類不必遵循與普通類相同的規則和准則,但這並不意味着我們不能實現它們。

因此,當您覺得您的測試類中有一些通用功能時,您應該提取一些測試使用的 class。 對於普通的商務艙,您也會這樣做,不是嗎?

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

如果您想記錄在測試框架中拋出的實際異常,您還可以讓您的常用方法重新拋出異常,而不是只返回truefalse

免責聲明:有些人不會喜歡這個,因為它濫用 class inheritance 來保存代碼。 它是這項工作的潛在工具,您可以評估它是否適合您。

這似乎可以通過基礎 class 來定義共享測試來實現。 也許這樣的事情會實現你想要做的事情?

// note: no [TestClass] on this type so it doesn't get discovered by MSTest.  
// Probably should also be abstract.
public class SharedTests<T> where T : IPlugin
{
    [TestMethod]
    public void NullLocalPluginContext()
    {
        XrmFakedContext context = new XrmFakedContext();

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

您的插件類將從這個 class 繼承:

[TestClass]
public class CheckDuplicateOrderTests : SharedTests<CheckDuplicateOrder>
{
    // NullLocalPluginContext test is inherited from the parent type
}

[TestClass]
public class SomeOtherPluginTests : SharedTests<SomeOtherPlugin>
{
    // Also has NullLocalPluginContext test inherited, but for testing SomeOtherPlugin
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM