C# 为方法编写NUnit测试用例

C# 为方法编写NUnit测试用例,c#,unit-testing,nunit,nancy,C#,Unit Testing,Nunit,Nancy,我是Nunit的新手。请帮助编写测试用例。 这是我的课 public CommandModule(ICommandFetcher fetcher,ICommandBus commandBus) { //Get["/"] = p => //{z // return Response.AsText((string)Request.Form.Username); //}; Post["/"]

我是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;
        };
    }
}
谢谢大家!

我试着用下面的方法

 [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();
[测试]
当重新发送命令时公共无效\u it\u将\u发送给\u命令\u总线()
{
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();
var browser=新浏览器(使用=>
{
带.Module();
依赖关系(fakeCommand);
});
var result=browser.Post(“/”,带=>
{
with.HttpRequest();
带有.JsonBody(信封);
});
A.CallTo(()=>fakeCommand.Send(rCommand,envelope.MetaData)).musthaveOccurd();
但是
A.CallTo(()=>fakeCommand.Send(rCommand,envelope.MetaData)).musthaveOccessed();

rcommand值中有某种错误听起来像是要显式测试执行代码时是否调用了ICommandBus.Send

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

如果您采用这种方法,您通常会使用模拟框架(例如Moq或Rhinomock)来实现这一点

为了简单地解释如何使用mock,我将展示如何通过自己显式地实现一个记录方法调用的mock对象并在之后进行测试来实现这一点

例如

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

[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 );

}
[TestCase]
public void postssendscommandonbus()
{
//安排
var mockCommandBus=new mockCommandBus();
ICommand expectedCommand=;
元数据expectedMetaData=;
//使用mockCommandBus构造CommandModule的代码。
//表演
//调用正在测试的方法的代码。
//断言
AreEqual(expectedCommand、mockCommandBus.PassedCommand);
AreEqual(expectedMetaData、mockCommandBus.PassedMetaData);
}
注意事项:


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

您不应该这样做o能够在编写函数之前编写测试。如果编写测试时遇到问题,您必须质疑自己是否真正理解实现的要求。从命令开始。Send()然后问问你自己你认为应该发生什么。这将引导你编写单元测试。SO读者很难建议进行单元测试,因为我们不知道你期望发生什么。谢谢你的评论
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 );

}