Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用moq和重写构造函数?_C#_Mocking_Moq - Fatal编程技术网

C# 如何使用moq和重写构造函数?

C# 如何使用moq和重写构造函数?,c#,mocking,moq,C#,Mocking,Moq,是否可以使用moq库来moq和重写构造函数 我有一门课是这样的: public class A{ private string _b; public A() { _b = Service.getB(); } public int duplicate(int a){ return a*2; } } 我想测试方法“duplicate”,但我不能实例化类型A的对象,因为我缺少一些依赖项。我是否可以通过某种方式重写/mock

是否可以使用moq库来moq和重写构造函数

我有一门课是这样的:

public class A{
    private string _b;
    public A()
    {
        _b = Service.getB();
    }
    public int duplicate(int a){
       return a*2;
    }
}
我想测试方法“duplicate”,但我不能实例化类型A的对象,因为我缺少一些依赖项。我是否可以通过某种方式重写/mock构造函数来创建一个对象并将其用于测试其他方法


更改只应用于测试,我不应更改A类

那么
服务到底是什么?更好的设计是将其作为构造函数的参数输入。然后,您可以模拟/存根它,并能够测试您的
复制
方法,而无需任何硬编码依赖项。

如果我理解正确,您可以做的是创建一个新的内部构造函数,以便您可以从外部注入依赖项(或使用任何依赖项注入框架)

因此,您不会更改其他程序集的公共API,并在测试程序集中向assembly.cs添加一个属性

[InternalsVisibleTo("YourTestAssembleNamespace.TestClass.dll")]
所以在你的测试中,你会这样做

//bmock = new Mock<IB>();
var A = new A(bmock);
//bmock=new Mock();
var A=新A(b股票);

不可能使用重写或模拟构造函数

即使您尝试创建
TestA
类并从
A
继承它,也会调用无参数构造函数。您可以在下面的文章中阅读更多内容。还有一段引述自:

如果类不包含实例构造函数声明,则默认 实例构造函数是自动提供的。违约 构造函数只调用直接函数的无参数构造函数 基类。如果直接基类没有可访问的 无参数实例构造函数,发生编译时错误

如果确实需要重写构造函数,您可以查看另一个模拟框架(例如,甚至可以模拟静态构造函数)


有很多模拟框架和演示文稿可以帮助您选择正确的工具。

更好的设计(主观上)是将您对服务的依赖性注入构造函数。那么单元测试就容易多了(因为您可以很容易地模拟
Service.getB()
)。谢谢是的,我知道,但不幸的是,在这种情况下我不能修改类。我只是想知道是否有可能像这样测试它。如果我可以改变A类,这可能是一个解决方案,但不是在这种情况下,我根本不同意这个解决方案。您不应该仅仅为了可测试而修改核心代码。您应该在设计和体系结构中最有意义的时候,在编写代码时考虑测试。@EkoostikMartin同意您的观点,即不应修改核心代码,但在某些情况下,如果逻辑没有更改,并且仅允许依赖项注入(即使依赖项注入很差)才是支持测试的更改,这可能是一场灾难solution@EkoostikMartin我也不同意“不改变代码以使其可测试”的理论。现实情况是,有很多编写的代码根本不可测试,为了对它所做的事情有信心,有时您必须重构(而不是重新设计)它来提供这一点。我认为“不改变代码以使其可测试”的理论忽略了棕色地带的开发,应该走向消亡。@Damon-那么你将设计和干净的设计实现结合起来,只是为了进行单元测试?因此,此时进行单元测试会使软件“更糟糕(理论上)”。作为一个极端的例子,您将私有方法公开以使其可测试。这是一个滑坡。顺便说一句,我并不是说根本不进行测试。在这种情况下,您可以进行集成测试,这样就不需要模拟了。@argonius如果您确实无法更改要测试的类,那么这就是最好的答案。您将需要一个使用反射拦截调用的模拟框架。这将是一个比仅仅提供一个构造函数覆盖来允许注入要沉重得多的解决方案,但这听起来似乎是您唯一的选择。我为你感到难过-D
//bmock = new Mock<IB>();
var A = new A(bmock);