c# - 通过依赖注入注入派生测试类使用基类函数
问题描述
我有一个看起来像这样的库:
class BaseType {
public string MyFunction() {
return "Abc";
}
}
class MyClass {
public MyClass(BaseType baseType) {
Console.WriteLine(myType.MyFunction());
}
}
现在我正在像这样测试它:
class TestingBaseType : BaseType {
public new string MyFunction() {
return "def";
}
}
class Unittests {
public void Test() {
new MyClass(new TestingBaseType());
//Logs "Abc". But I need "def".
}
}
我的真实代码没有执行注入的 mock BaseClass
。如何在不编辑生产代码的情况下进行这样的测试。由于我编写单元测试的方式,我不想编辑生产代码。
解决方案
如果你不能使基类的方法成为虚拟的,那么就不要使用派生类,而是声明一个接口。无论如何,接口是实现有效依赖注入的关键概念。
生产代码:
public interface IType
{
string MyFunction();
}
public class MyType : IType
{
public string MyFunction() => "Abc";
}
class MyClass
{
public MyClass(IType myType)
{
Console.WriteLine(myType.MyFunction());
}
}
测试代码:
public class MyTestingType : IType
{
public string MyFunction() => "Def";
}
class Unittests
{
public void Test()
{
new MyClass(new MyTestingType());
}
}
推荐阅读
- android - Firestore messaging data payload not always working
- windows - Windows Surface on-screen keyboard will disappear when focusing on password input
- c# - Is it necessary to load SqlServerTypes when using Microsoft ReportViewerControl v14?
- spring-webflux - webflux:跨域+基本授权不起作用?
- python - Keras:如何使用来自另一个张量的信息对张量进行切片?
- php - 在functions.php而不是JSON中返回生成的HTML是不好的做法吗?
- azure - 在 Azure 中运行的 .NET Core 中的 Azure WebJob
- bash - 从父 Bash 进程中杀死一个子进程
- php - 使用标题时PHP输出回显为文本
- php - 解析 PHP 的 XML