如何解释这个(rhino)模拟单元测试失败的消息

时间:2009-06-05 00:51:46

标签: c# unit-testing rhino-mocks

我正在尝试测试正确加载加载UI矩阵的方法。测试失败,除非我告诉模拟框架忽略传递的参数,给我以下消息:

Rhino.Mocks.Exceptions.ExpectationViolationException: ITimeSheetMatrixWidget.Load (Smack.ConstructionAdmin.Domain.TransferObjects.TimeSheetDtoAssembler + d__1);预期#1,实际#0。

有趣的是,该消息以某种方式调用另一个从域模型组装DTO的对象 - 我不明白!

这是接口/方法Sut是:

public interface ITimeSheetMatrixWidget : IMatrixWidget {
    .....
    void Load(IEnumerable<DynamicDisplayDto>activities);
    .....

}

这是测试:

[Test]
public void SettingTheWidget_TriggersLoad_NonProjectActivities() {
        var f = _getFacade();
        // create test activities
        TestDataFactory.SetupTestActivities(f);
        Assert.That(f.NonProjectDtos.Count(), Is.GreaterThan(0));

        // create the presenter
        var filterService = MockRepository.GenerateStub<IProjectFilterService>();
        var view = MockRepository.GenerateStub<ITimeSheetView>();
        var timeSheetPresenter = new TimeSheetPresenter(f, filterService, view);

        // inject the mocked widget & trigger the Load
        var widget = MockRepository.GenerateMock<ITimeSheetMatrixWidget>();
        timeSheetPresenter.ActivityMatrix = widget;

        widget.AssertWasCalled(x => x.Load(f.NonProjectDtos), 
            mo =>mo.IgnoreArguments()); <-- ok, but not useful
        //widget.AssertWasCalled(x => x.Load(f.NonProjectDtos)); <-- generates the Exception
    }

有人可以解释失败消息吗?

顺便说一句,我今天早上在Rhino Mocks论坛上发布了这个帖子,但那里的流量看起来很低。

感谢您的帮助! Berryl

2 个答案:

答案 0 :(得分:1)

犀牛说明了测试布局的方式,我没有得到我告诉它的电话。下面的测试是测试IEnumerable参数的有效方法:

[Test]
public void ProjectMatrix_Injection_IsLoaded()
    {
        _projectMatrix = MockRepository.GenerateMock<ITimeSheetMatrixWidget>();

        var dtos = _facade.ProjectDtos;
        _projectMatrix.Expect(x => x.Load(Arg<IEnumerable<DynamicDisplayDto>>.List.Equal(dtos))).Return(dtos.Count());

        new MatrixEntryService(_facade, _projectMatrix, _nonProjectMatrix, _totalMatrix);

        _projectMatrix.VerifyAllExpectations();
    }

第一个技巧是使用Rhino参数约束:

Arg<IEnumerable<DynamicDisplayDto>>

第二个技巧是使用List扩展名,而不是Is:

List.Equal(dtos)

答案 1 :(得分:0)

我认为它预计有一个电话但没有。但