用参数模拟一个方法

时间:2014-03-05 21:00:22

标签: c# unit-testing mocking moq

我正在嘲笑我的控制器方法,我的控制器看起来像这样

我的控制器:

public class PController : BaseController
{
    readonly IRFacade _repository;

    public PController()
    {
        _repository =  new RiFacade();
    }

    [CLSCompliant(false)]
    public PController(IRFacade repositories)
    {
        if (repositories == null) throw new ArgumentNullException("repositories");
        _repository = repositories;
    }

    public aMethod(String Id){
        int[] arraynum = convert id to int[]
        int numberthis = _repository.ActionFunction(arraynum);
        ..return stuff

    }

我创建的界面IRFacade看起来像这样

public interface IRFacade 
{        
    int ActionFunction(int[] arrayOfNum);
}

当我测试aMethod并且我必须模仿_repository时,我就这样做了设置

var MockFacade = new Mock<IRFacade>();
// here fakeinput is a int[] varaible and aNumber is a int variable
MockFacade.Setup(r => r.ActionFunction(fakeinput)).Returns(aNumber);

我的问题是,为什么我必须传递一个实际的int []变量fakeInput我声明反对只是在我设置模拟时传入参数类型r.ActionFunction(int[] avaraible)? / p>

2 个答案:

答案 0 :(得分:5)

当你设置这样的方法时:

MockFacade.Setup(r => r.ActionFunction(new[] {1,2,3})).Returns(5);

您将其设置为返回5 if ,仅 if ,数字为1,2和3的数组作为参数传递。

如果您希望自己的方法为任何输入返回5,则应使用It.IsAny<T>()代替。

MockFacade.Setup(r => r.ActionFunction(It.IsAny<int[]>())).Returns(5);

答案 1 :(得分:0)

在这里,你想要array 1,2,3

MockFacade.Setup(r => r.ActionFunction(new int[]{1,2,3})).Returns(aNumber);

如果您想要int array

MockFacade.Setup(r => r.ActionFunction(It.IsAny<int[]>())).Returns(aNumber);

如果您想确保array至少有1个,但您可以通过lambda始终建立更多条件:

MockFacade.Setup(r => r.ActionFunction(It.Is<int[]>(a=>a.Contains(1)))).Returns(aNumber);