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
Unit testing Moq部分类,如Rhino Mock中的_Unit Testing_Moq - Fatal编程技术网

Unit testing Moq部分类,如Rhino Mock中的

Unit testing Moq部分类,如Rhino Mock中的,unit-testing,moq,Unit Testing,Moq,嗨,我对嘲弄还不熟悉 我有一门课: public class Car { public virtual void Register() { ... Warrant(); } public virtual void Warrant() { ... } } 我想测试注册调用授权。使用我设计的Rhinomock: [Test] public void RhinoCarTest() { var mocks = n

嗨,我对嘲弄还不熟悉

我有一门课:

public class Car
{
    public virtual void Register() {
        ...
        Warrant();
    }

    public virtual void Warrant() {
        ...
    }
}
我想测试
注册
调用
授权
。使用我设计的Rhinomock:

[Test]
public void RhinoCarTest() {
    var mocks = new Rhino.Mocks.MockRepository();
    var car = mocks.PartialMock<Car>();

    mocks.ReplayAll();

    car.Stub(x => x.Warrant());

    car.Register();

    car.AssertWasCalled(x => x.Warrant());
}
[测试]
公营机构{
var mocks=new Rhino.mocks.MockRepository();
var car=mocks.PartialMock();
mocks.ReplayAll();
car.Stub(x=>x.carry());
汽车登记册();
调用car.assertwas(x=>x.carry());
}
我甚至不确定这是否正确,但它似乎起到了作用。我想在莫克做同样的事情。我似乎找不到部分最小起订量

我想到的是:

[Test]
public void MoqCarTest() {
    var car = new Mock<Car>();

    car.Setup(x => x.Warrant());

    car.Object.Register();

    car.Verify(x => x.Warrant());
} 
[测试]
公共空间{
var car=新模拟();
car.Setup(x=>x.carry());
car.Object.Register();
验证(x=>x.carry());
} 

但这根本不起作用。有人能给我指出正确的方向吗?

Rhino中的部分类。除非您设置了Mock和/或stub,否则Mock将调用基类方法。默认情况下,如果您创建mock来专门调用基类方法,Moq将只调用基类方法。以下是一个适用于您的示例的示例:

var car = new Mock<Car> {CallBase = true};
car.Object.Register();
car.Verify(c => c.Warrant(), Times.Once());
var-car=newmock{CallBase=true};
car.Object.Register();
验证(c=>c.carry(),Times.Once());
但是,我会尝试避免这种方法(验证是否调用了特定的方法)。相反,您的测试应该简单地确保在调用方法之后完成了正确的“工作”。如何完成这项工作是该方法的私有实现


如果您编写的测试能够确保调用某些方法,那么随着时间的推移,您的测试可能会变得更加脆弱,尤其是当您为性能或其他问题重构时。

嗨,帕特里克·斯蒂尔,谢谢您的回答。因此,如果您将Register方法存根去掉,使存根返回您在测试中想要的内容,这是正确的。然后您只需测试功能是否正确。另一件事是,如果你说你不应该检查已经调用的方法,你是说理想情况下你根本不应该使用Verify吗?如果Register方法是你想要测试的,你应该去掉carry方法,这样里面的任何bug都不会影响你对Register的单元测试。然后,编写一个单独的单元测试。我使用Verify来确保对某些对象(通常是依赖项)调用方法。示例:如果我有一个应该将数据保存到数据库的类,那么我将验证在调用“Update”期间是否调用了mock iReportory的“save”方法。同样,我可以确保在不应该调用它的时候不调用它。