gpt4 book ai didi

c# - 使用 Moq 测试是否调用了外部库的方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:09 26 4
gpt4 key购买 nike

对于一个项目,我正在使用 MEF 框架的 CompositeContainer 类。现在我想进行一个单元测试(使用最小起订量)来验证是否调用了 ComposeParts(这是 AttributedModelServices 中的扩展方法)方法。

仅仅用最小起订量模拟它是行不通的,因为这个方法不是虚拟的。我找到了一些方法来做到这一点,但所有这些方法都让我改变了 CompositeContainer 类,这是我做不到的。

最小起订量中是否有一种方法可以测试是否调用了外部第 3 方库的非虚拟方法?

预先感谢您的回复。

示例代码:

public void Load(string path, CompositionContainer container)
{
container.ComposeParts(this);
}

这里的容器来自 MEF 库,ComposeParts 是 System.ComponentModel.Composition 命名空间中的扩展方法:

//
// Summary:
// Creates composable parts from an array of attributed objects and composes
// them in the specified composition container.
//
// Parameters:
// container:
// The composition container to perform composition in.
//
// attributedParts:
// An array of attributed objects to compose.
public static void ComposeParts(this CompositionContainer container, params object[] attributedParts);

最佳答案

我不认为可以直接验证第三方库方法是用 Moq 调用的,但您可以检查调用该方法的副作用。由于您正在使用 MEF 在运行时检索您的实现,因此我会测试您的类型是否已正确加载。所以如果你有这样的事情:

public interface IInterfaceToCompose
{
string MethodToCreate();
}

[Export(typeof(IInterfaceToCompose))]
public class ConcreteImplementation1 : IInterfaceToCompose
{
public string MethodToCreate()
{
return "Implementation 1";
}
}

[Export(typeof(IInterfaceToCompose))]
public class ConcreteImplementation2 : IInterfaceToCompose
{
public string MethodToCreate()
{
return "Implementation 2";
}
}

然后您可以编写如下所示的测试:

[ImportMany(typeof(IInterfaceToCompose))]
public IInterfaceToCompose ComposedItems { get; set; }

[Test]
public void WhenComposingTheComposedItems_ShouldLoadExportedTypes()
{
Load("testPath", YourContainer);

Assert.AreEqual(2, ComposedItems.Count());
}

您真正想要测试的 (IMO) 是您是否正确创建了组合类,并且它们都可以由 MEF CompositionContainer 加载。

一个好的第二个测试是进行初始加载,添加一个带有第三个实现程序的 dll,并确保最终计数为 3(您的系统是否动态加载新模块)。这将捕获错误,例如忘记使用 Export 属性对新实现进行属性化,并确保您的类在发生更改时正确地获取更改。

关于c# - 使用 Moq 测试是否调用了外部库的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com