[英]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));
}
}
如果您想記錄在測試框架中拋出的實際異常,您還可以讓您的常用方法重新拋出異常,而不是只返回true
或false
。
免責聲明:有些人不會喜歡這個,因為它濫用 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.