【问题标题】:Testing with Rhino Mock throws an error使用 Rhino Mock 进行测试会引发错误
【发布时间】:2015-07-28 17:12:00
【问题描述】:

您好,我是 TDD 的初学者,使用 RhinoMocks 在应用程序中创建 moqs。我正在尝试实现 MVP 模式。

这是我的界面

public interface IView
{
   List<Bundle> DisplayList { get; set; }  
}

还有我的 Presenter 类

public class Presenter
{
    private IView View;
    public Presenter(IView view)
    {
        View = view;            
    }

    public void Bind()
    { 
        // I am creating a dummy list in MockDataLayer and SelectAll Method returns the whole list
        IDataLayer dsl=new MockDataLayer();
        View.DisplayList = dsl.SelectAll();
    } 
}

下面是我的测试类

public class PresenterTest 
{

    private IView _view;
    private Presenter _controller;

    [Test]
    public void View_Display_List()
    {
        //Arrange
        _view = MockRepository.GenerateMock<IView>();
        List<Bundle> objTest = new List<Bundle>();            
        _controller = new Presenter(_view);
        _view.Expect(v => v.DisplayList).Return(objTest);

        //Act
        _controller.Bind();

        //Assert
        _view.VerifyAllExpectations();
    }
}

当我执行测试时,我收到此错误:

depaulOAR.PatchBundleTesting.Test.BundlePresenterTest.BundleView_Display_Bundle_List:
Rhino.Mocks.Exceptions.ExpectationViolationException : IBundleView.get_DisplayList(); Expected #1, Actual #0.

我们将不胜感激。

编辑: 注意我从这个链接获得帮助。几乎所有东西都是 除了测试部分工作。当我在 Web 表单上实现它时,我的 浏览器显示列表。但是当我测试视图时它会抛出一个错误 http://www.bradoncode.com/blog/2012/04/mvp-design-pattern-survival-kit.html

感谢“老狐狸”的帮助。但现在我的问题是它抛出了一个不同的错误

【问题讨论】:

    标签: c# asp.net unit-testing mocking rhino-mocks


    【解决方案1】:

    你在IView.DisplayList的getter上初始化一个期望:

    _view.Expect(v => v.DisplayList).Return(objTest);
    

    上面的代码是对 getter 的期望。

    在被测方法中,您使用IView.DisplayList 的设置器:

    View.DisplayList = dsl.SelectAll();
    

    我认为您要测试的行为是:“要显示的项目已在视图中设置”。 如果是这样,您的测试应该类似于:

    [Test]
    public void View_Display_List()
    {
       //Arrange
       _view = MockRepository.GenerateMock<IView>();
       List<Bundle> objTest = new List<Bundle>();
       controller = new Presenter(_view);
    
       //Act
       _controller.Bind();
    
       //Assert
       CollectionAssert.AreEquivalent(The same items MockDataLayerl.SelectAll() returns 
                                      ,_view.DisplayList );
    }
    

    编辑:

    验证分配给View.DisplayList 的内容比上面的示例更容易。 你必须验证View.DisplayList 不是null

    [Test]
    public void View_Display_List()
    {
       //Arrange
       _view = MockRepository.GenerateMock<IView>();
       _view.Stub(x => x.Display List).Property Behavior();
       List<Bundle> objTest = new List<Bundle>();
       controller = new Presenter(_view);
    
       //Act
       _controller.Bind();
    
       //Assert
       Assert.IsNotNull(_view.DisplayList );
    } 
    

    【讨论】:

    • 我想测试 View.DisplayList 不为空。它包含分配给它的数据。
    • @fais,因为View 是一个模拟,你只需要验证_view.DisplayList 不为空。查看我的编辑。
    • 当我像你一样更改我的代码并执行它时。我收到一个新错误:depaulOAR.PatchBundleTesting.Test.BundlePresenterTest.BundleView_Display_Bundle_List_Not_Empty: Expected: not null But was: null 虽然我的列表不是空的
    • @fais 因为您使用GenerateMock 方法而不是GenerateStub,您需要在排列部分指定_view.Stub(x =&gt; x.Display List).Property Behavior();。我更新了我的答案。
    • @fais 我没有创建任何stub,正如我所说,看看我的更新。默认情况下,stub 中的每个属性都表现为属性。在mock中默认每个属性都返回类型的默认值,除非你使用扩展方法:PropertyBehavior()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2019-09-12
    相关资源
    最近更新 更多