代码之家  ›  专栏  ›  技术社区  ›  ctrlplusb

使用rhinomocks来模拟一个参数,这个参数是在我正在测试的方法中创建的

  •  35
  • ctrlplusb  · 技术社区  · 14 年前

    bool IsLoginValid(LoginViewModel viewModel, out User user);
    

    最初尝试过:

    dependency<ILoginService>()
    .Stub(serv =>
            serv.IsLoginValid(
                Arg<LoginViewModel>.Is.Equal(a_login_viewmodel),
                out Arg<User>.Is.Anything)
    .Return(false);
    

    但是,这失败了,因为它是一个out参数。做了一些搜索,修改了我的代码如下:

    dependency<ILoginService>()
    .Stub(serv => 
            serv.IsLoginValid(
                Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
                out Arg<User>.Out(new User()).Dummy))
    .Return(false);
    

    这也失败了。我需要'new User()'作为'Anything'参数。因为我认为这是期待一个具体的例子。

    你知道怎么解决这个问题吗?谢谢你们。

    2 回复  |  直到 14 年前
        1
  •  49
  •   PatrickSteele    14 年前

    尝试“OutRef”选项。它接受一个params对象[],该对象为每个out参数定义结果。既然你只有一个,你只需要一个结果。下面是一个我尝试过的在你的情况下应该有用的快速模型:

    var foo = MockRepository.GenerateStub<IFoo>();
    var viewModel = new LoginViewModel();
    User temp;
    foo.Stub(f => f.IsLoginValid(viewModel, out temp)).OutRef(new User()).Return(false);
    
    User outparam;
    Assert.IsFalse(foo.IsLoginValid(viewModel, out outparam));
    
        2
  •  16
  •   onedaywhen    10 年前

    .Stub(serv => serv.IsLoginValid(
                a_login_viewmodel, 
                out temp)).OutRef(new User())
    .Return(false);
    

    …然后将语法(而不是语义)更改为fluent Args 语法:

    .Stub(serv => serv.IsLoginValid(
                Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
                out Arg<User>.Out(new User()).Dummy))
    .Return(false);
    

    …然后我们得到了与OP第二次尝试完全相同的语法,显然“失败了”。就我个人而言,我更喜欢流利的“Args”风格,尽管它稍微冗长一些。