代码之家  ›  专栏  ›  技术社区  ›  Umair Ahmed

如何断言使用nunit调用了特定方法?

  •  8
  • Umair Ahmed  · 技术社区  · 16 年前

    作为测试的结果,如何测试使用正确参数调用的特定方法?我正在使用 NUnit .

    该方法不返回任何内容。它只写在一个文件上。我用一个模拟对象 System.IO.File . 所以我想测试函数是否被调用。

    4 回复  |  直到 11 年前
        1
  •  11
  •   Dmytrii Nagirniak    16 年前

    需要更多的上下文。所以我在这里放一个,在混合物中加入Moq:

    pubilc class Calc {
        public int DoubleIt(string a) {
            return ToInt(a)*2;
        }
    
        public virtual int ToInt(string s) {
            return int.Parse(s);
        }
    }
    
    // The test:
    var mock = new Mock<Calc>();
    string parameterPassed = null;
    mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s);
    
    mock.Object.DoubleIt("3");
    Assert.AreEqual("3", parameterPassed);
    
        2
  •  11
  •   Graviton    16 年前

    您必须使用一些模拟框架,例如 Typemock 或 Rhino Mocks 或 NMocks2 .

    努尼特还有一个 Nunit.Mock 但它并不广为人知。

    可以找到moq的语法 here :

    var mock = new Mock<ILoveThisFramework>();
    
    // WOW! No record/reply weirdness?! :)
    mock.Setup(framework => framework.DownloadExists("2.0.0.0"))
        .Returns(true)
        .AtMostOnce();
    
    // Hand mock.Object as a collaborator and exercise it, 
    // like calling methods on it...
    ILoveThisFramework lovable = mock.Object;
    bool download = lovable.DownloadExists("2.0.0.0");
    
    // Verify that the given method was indeed called with the expected value
    mock.Verify(framework => framework.DownloadExists("2.0.0.0"));
    

    另外,请注意,您只能模拟 界面 ,所以如果您的对象来自 System.IO.File 没有接口,那么你可能做不到。你得把电话转到 系统文件 在您自己的自定义类中进行作业。

        3
  •  3
  •   tster    16 年前

    通过对接口使用模拟。

    说你上课了 ImplClass 它使用接口 Finder 你要确保 Search 使用参数“hello”调用函数;

    所以我们有:

    public interface Finder 
    {
      public string Search(string arg);
    }
    

    和

    public class ImplClass
    {
      public ImplClass(Finder finder)
      {
        ...
      }
      public void doStuff();
    }
    

    然后你可以为你的测试代码写一个模拟

    private class FinderMock : Finder
    {
      public int numTimesCalled = 0;
      string expected;
      public FinderMock(string expected)
      {
        this.expected = expected;
      }
      public string Search(string arg)
      {
        numTimesCalled++;
        Assert.AreEqual(expected, arg);
      }
    }
    

    然后测试代码:

    FinderMock mock = new FinderMock("hello");
    ImplClass impl = new ImplClass(mock);
    impl.doStuff();
    Assert.AreEqual(1, mock.numTimesCalled);
    
        4
  •  2
  •   Hasse    11 年前

    在Rhino Mocks中,调用了名为assertwas的方法

    这是一种使用方法

    var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>();
    
    var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager);
    
    mailHandler.NotifyPrinting(User, Info);
    
    mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());