【问题标题】:Writing NUnit Test Cases for method为方法编写 NUnit 测试用例
【发布时间】:2013-11-28 12:33:27
【问题描述】:

我是 Nunit 的新手。请帮助编写测试用例。 这是我的课

    public CommandModule(ICommandFetcher fetcher,ICommandBus commandBus)
    {

        //Get["/"] = p =>
        //{z
        //    return Response.AsText((string)Request.Form.Username);
        //};

        Post["/"] = parameters =>
        {
            var commandRequest = this.Bind<MessageEnvelope>();
            var command = fetcher.FetchFrom(commandRequest);
            commandBus.Send((ICommand)command, commandRequest.MetaData);
            return HttpStatusCode.OK;
        };
    }
}

我想测试一下这个方法

  commandBus.Send((ICommand)command, commandRequest.MetaData);

谢谢!

我试试下面的方法

 [Test]
    public void whern_reseiving_command_it_sent_to_the_command_bus()
    {

        var rCommand = new DummyCommand() { SomeProp = 2 };
        var serializedCommand = JsonConvert.SerializeObject(rCommand);
        var envelope = new MessageEnvelope() { MetaData = new MetaData() { MessageType = "DummyCommand", MessageTypeVersion = 1 }, MessageData = serializedCommand };
        var fakeCommand = A.Fake<ICommandBus>();

        var browser = new Browser(with =>
        {
            with.Module<CommandModule>();
            with.Dependency<ICommandBus>(fakeCommand);

        });

        var result = browser.Post("/", with =>
        {
            with.HttpRequest();
            with.JsonBody(envelope);
        });

        A.CallTo(() => fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened();

但是A.CallTo(() =&gt; fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened(); 它在 rcommand 值中有某种错误

【问题讨论】:

  • 你应该能够在编写函数之前编写测试。如果您在编写测试时遇到困难,您必须质疑您是否真的了解实现的要求。从你的 command.Send() 开始,问问自己你认为应该发生什么。这将引导您编写单元测试。 SO 读者很难建议单元测试,因为我们不知道您期望发生什么。
  • 感谢您的评论

标签: c# unit-testing nunit nancy


【解决方案1】:

听起来您希望明确测试在执行代码时是否调用了ICommandBus.Send

一种方法是模拟 ICommandBus 依赖项。也就是说,插入一个实现ICommandBus 的模拟对象,该对象能够检测是否使用正确的参数值调用了该方法。

如果您采用这种方法,您通常会使用模拟框架(例如 Moq 或 RhinoMocks)来执行此操作。

为了简要说明您将如何使用模拟,我将通过自己显式实现一个记录方法调用的模拟对象对象来展示如何做到这一点,然后对其进行测试。

例如

MockCommandBus : ICommandBus
{
    ICommand PassedCommand { get; set; }
    MetaData PassedMetaData { get; set; }

    public void Send(ICommand command, MetaData metaData)
    {
        this.PassedCommand = command;
        this.PassedMetaData = metaData;
    }    
}

那么您的测试用例将如下所示:

[TestCase]
public void PostSendsCommandOnBus()
{
    // ARRANGE
    var mockCommandBus = new MockCommandBus();

    ICommand expectedCommand = <whatever you expect>;
    MetaData expectedMetaData = <whatever you expect>;

    // Code to construct your CommandModule with mockCommandBus.

    // ACT
    // Code to invoke the method being tested.

    // ASSERT
    Assert.AreEqual(expectedCommand, mockCommandBus.PassedCommand);
    Assert.AreEqual(expectedMetaData , mockCommandBus.PassedMetaData );

}

警告:

请注意,这只是恰好符合您在这里要求的单元测试的一种方法。过度使用 mock 来测试与低级别依赖项的显式交互可能会导致开发非常脆弱的测试套件,这些套件测试的是底层实现而不是系统的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    相关资源
    最近更新 更多