代码之家  ›  专栏  ›  技术社区  ›  Raj Rao

moq-基于参数值(多个参数)设置方法

  •  49
  • Raj Rao  · 技术社区  · 14 年前

    我有一个接口定义为

    interface IMath
    {
     AddNumbersBetween(int lowerVal, int upperVal);
    }
    

    我可以为以上内容设置一个基本的MOQ,如下所示:

    Mock<IMath> mock = new Mock<IMath>();    
    mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()));
    

    叫它吧

    mock.Object.AddNumbersBetween(1,4);
    

    然后验证它是否被调用

    mock.Verify(m => m.AddNumbersBetween(1,4), Times.AtleastOnce());
    

    我不知道如何设置方法addNumbersBetween,这样如果upperval低于lowerval,就会引发异常。

    mock.Object.AddNumbersBetween(4,1);//should throw an exception
    

    基本上是在寻找:

    mock.Setup(foo => foo.AddNumbersBetween("arg1 is higher than arg2")).Throws<ArgumentException>();
    
    2 回复  |  直到 14 年前
        1
  •  93
  •   Peter    6 年前

    我知道这是一年前的事了,但我找到了一种方法,至少在最新版本的MOQ中使用多个参数:

    mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()))
        .Returns<int, int>((a, b) => a < b);
    
        2
  •  9
  •   srodriguez    14 年前

    对于单参数方法,最干净的方法是:

    mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>();
    ...
    public string IsLarge() 
    { 
      return Match<string>.Create(s => !String.IsNullOrEmpty(s) && s.Length > 100);
    }
    

    如果方法有多个参数,则无法应用此方法。还有一个“解决方案”可以使用,它模拟您想要实现的目标:

    /// <summary>
    /// Tests if a moq can send an exception with argument checking
    ///</summary>
    [TestMethod]
    public void TestException()
    {
        Mock<IMath> mock = new Mock<IMath>();
        mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()));
    
        mock.Setup(foo => foo.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()))
            .Callback<int, int>((i, j) => CheckArgs(i, j));
    
        try
        {
            mock.Object.AddNumbersBetween(1, 2);
        }
        catch (Exception ex)
        {
            // Will not enter
            Console.WriteLine("Exception raised: {0}", ex);
        }
        try
        {
            mock.Object.AddNumbersBetween(2, 1);
        }
        catch (Exception ex)
        {
            // Will enter here, exception raised
            Console.WriteLine("Exception raised: {0}", ex);
        }
    }
    
    private bool CheckArgs(int i, int j)
    {
        if( i > j)
            throw new ArgumentException();
        return true;
    }