Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
Unit testing 如何用Moq模拟具体对象上的函数调用?_Unit Testing_Mocking_Tdd_Moq - Fatal编程技术网

Unit testing 如何用Moq模拟具体对象上的函数调用?

Unit testing 如何用Moq模拟具体对象上的函数调用?,unit-testing,mocking,tdd,moq,Unit Testing,Mocking,Tdd,Moq,我怎样才能在最小起订量内做到这一点 Foo bar = new Foo(); Fake(bar.PrivateGetter).Return('whatever value') 似乎我只能找到如何模拟通过框架创建的对象。我只想在我创建的具体对象上模拟一个方法/属性 在TypeMock中,我只需执行隔离.WhenCalled(bar.PrivateGetter).Returns('whatever value') 有什么想法吗?只有TypeMock隔离器(也许还有鼹鼠)可以表演这些特技。正常的动态

我怎样才能在最小起订量内做到这一点

Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')
似乎我只能找到如何模拟通过框架创建的对象。我只想在我创建的具体对象上模拟一个方法/属性

在TypeMock中,我只需执行
隔离.WhenCalled(bar.PrivateGetter).Returns('whatever value')


有什么想法吗?

只有TypeMock隔离器(也许还有鼹鼠)可以表演这些特技。正常的动态模拟库可以。

您应该使用Moq创建模拟对象,并将CallBase属性设置为true以使用对象行为

根据Moq文件: CallBase定义为“如果没有期望覆盖成员,则调用基类实现。这称为“部分模拟”。它允许模拟类的某些部分,而不必模拟所有内容

示例代码:

[测试]
公共无效失败测试()
{
var mock=新的Moq.mock();
mock.Setup(m=>m.Number).Returns(4);
var testObject=mock.Object;
Assert.That(testObject.Number,Is.EqualTo(4));
Assert.That(testObject.Name,Is.EqualTo(“MyClass”);
}
[测试]
公共测试()
{
var mock=新的Moq.mock();
mock.Setup(m=>m.Number).Returns(4);
mock.CallBase=true;
var testObject=mock.Object;
Assert.That(testObject.Number,Is.EqualTo(4));
Assert.That(testObject.Name,Is.EqualTo(“MyClass”);
}
公共类MyClass
{
公共虚拟字符串名称{get{返回“MyClass”;}
公共虚拟整数{get{return 2;}}
}

只要签名上的类型可见,Moles也可以替换私有方法。因此,在这种情况下,它将如下所示:

MFoo bar = new MFoo { // instantiate the mole of 'Foo'
    PrivateGetterGet = () => "whatever value" // replace PrivateGetter {get;}
};
Foo realBar = bar; // retrive the runtime instance
...

如果您想了解有关Moles的更多信息,请从上的教程开始。

谢谢,我将尝试此方法。但是,使TypeMock看起来越来越诱人。啊!这不起作用-它在mock.Setup()行上给出了错误消息(在第二个示例中)“测试方法CRMFUndoffundPluginUnitTest.FoFPluginBaseTest.SetMissingTargetValuesTest1引发异常:System.ArgumentException:不可重写成员上的设置无效:m=>m.InputTargetDE。”。".你知道为什么吗?确保你正在模拟的方法是虚拟的,这样Moq就能覆盖它们。这实际上并不能回答问题。--这调用了基本方法,但要求你让Moq创建对象。--OP显示的场景有外部创建模拟对象的内容。可能没有回答问题,但是对于很多情况来说,它已经足够接近了,并且为我解决了问题。很高兴知道-希望有更多关于鼹鼠的信息-还没有听到任何关于它的消息。就索夫韦这里使用它的人们而言,这里是官方网站:Moq不能这样做已经不再是事实。@Mushinoshin哦,我不知道!你能提供一个lin吗k?@MushinNoShin是的,请务必阅读OP的评论:“这不起作用”。该答案解释了如何删除虚拟会员,而OP询问的是私人会员。我(已接受)答案中的链接解释了技术上可能的情况。