2

在我的代码中:

public class StudentPresenter
{
    IView myview;
    Repository myrepo;
    public StudentPresenter(IView vw, Data.Repository rep)
    {
        this.myview = vw;
        this.myrepo = rep;
        this.myview.ButonClick += myview_ButonClick;
    }

    public void myview_ButonClick()
    {
        var d = this.myrepo.GetById(int.Parse(myview.GivenId));
        this.myview.GetStudent(d);
    }
}

我想测试GetStudent方法会调用,所以我尝试了

[Test]
public void ctor_whenviewbuttonclick_callsviewButtonClickevent()
{
    var mock = Substitute.For<IView>();
    var stub=Substitute.For<Repository>();
    Student st = new Student();
    stub.When(p => p.GetById(Arg.Any<int>())).Do(x => st=new Student());

    StudentPresenter sp = new StudentPresenter(mock, stub);

    mock.ButonClick += Raise.Event<Action>();

    mock.Received().GetStudent(st);      
}

但测试坏了: 说:

Application.UnitTests.Form1Tests.ctor_whenviewbuttonclick_callsviewButtonClickevent: NSubstitute.Exceptions.ReceivedCallsException : 预期会收到匹配的呼叫:GetStudent(Student) 实际上没有收到匹配的呼叫。

我在这里做错了什么?

4

1 回答 1

3

这个错误很可能是由于Repository.GetById()不是virtual. 文档的创建替代页面上的介绍有一段关于替换类时要注意的事项。

排序后,需要对测试进行一些其他调整才能使其运行。我已经评论了这些部分,并做了一些小的重命名,以使我更容易理解。

[Test]
public void ctor_whenviewbuttonclick_callsviewButtonClickevent()
{
    var view = Substitute.For<IView>();
    var repo = Substitute.For<Repository>();
    //Stub out GivenId
    view.GivenId.Returns("42");
    Student st = new Student();
    //Make GetById return a specific Student for the expected ID
    repo.GetById(42).Returns(x => st);

    StudentPresenter sp = new StudentPresenter(view, repo);

    view.ButonClick += Raise.Event<Action>();

    view.Received().GetStudent(st);
}

第一个更改是 stub out GivenId,因为演示者要求它是一个可解析为整数的字符串。第二个是GetById返回预期的学生(原始示例中的When..do语法重新分配st变量。它没有设置返回值)。

希望这可以帮助。

于 2014-05-02T05:30:53.977 回答