使用Moq模拟基类方法调用

use*_*363 20 moq

我正在修改一个类方法,该方法格式化一些输入参数日期,这些日期随后在方法调用中用作参数调用到基类(它存在于另一个程序集中).

我想验证传递给我的方法的日期在传递给基类方法时格式正确所以我想要Moq基类方法调用.Moq可以实现吗?

Jim*_*San 14

截至2013年,您可以使用最新的Moq.这是一个例子

public class ViewModelBase
{
    public virtual bool IsValid(DateTime date)
    {
        //some complex shared stuff here
    }
} 

public class MyViewModel : ViewModelBase
{
    public void Save(DateTime date)
    {
        if (IsValid(date))
        {
            //do something here
        }
    }
}

public void MyTest()
{
    //arrange
    var mockMyViewModel = new Mock<MyViewModel>(){CallBase = true};
    mockMyViewModel.Setup(x => x.IsValid(It.IsAny<DateTime>())).Returns(true);

    //act
    mockMyViewModel.Object.Save();

    //assert
    //do your assertions here
} 
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 12

如果我正确理解你的问题,你在其他程序集中定义了一个A类,然后B类或多或少地实现了这样:

public class B : A
{
    public override MyMethod(object input)
    {
        // Do something
        base.MyMethod(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你要验证base.MyMethod是否被调用?

我不知道你如何使用动态模拟库来做到这一点.所有动态模拟库(具有TypeMock的例外)通过动态发出从所讨论的类型派生的类来工作.

你的情况,你不能很好地询问起订量从派生一个,因为你想测试.

这意味着你必须要求Moq给你一个Mock<B>.但是,这意味着发出的类型派生自B,虽然它可以覆盖MyMethod(仍然是虚拟的)并调用它的基础(B.MyMethod),但它无法进入原始类并验证B调用base.MyMethod.

想象一下,你必须编写一个派生自B的类(C).虽然你可以覆盖MyMethod,但你无法验证B调用A:

public class C : B
{
    public override MyMethod(object input)
    {
        // How to verify that base calls its base?
        // base in this context means B, not A
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,除了TypeMock可能的例外,动态模拟库也不能做你不能手动完成的任何事情.

但是,我会假设调用您尝试验证的基本方法有一些可观察到的副作用,因此如果可能,您是否可以使用基于状态的测试而不是基于行为的测试来验证调用方法的结果?

无论如何,在大多数情况下,基于状态的测试应该是您的默认方法.