标签: rhino-mocks

如何设置Expect调用以检查Rhino Mocks中是否未调用方法

使用Rhino Mocks,如何确保在模拟对象上设置Expectations时不调用方法.

在我的示例中,我正在测试Commit方法,我需要确保在执行提交时不调用Rollback方法.(这是因为我在提交方法中有逻辑,如果提交失败将自动回滚)

这是代码的样子......

[Test]
public void TestCommit_DoesNotRollback() 
{
    //Arrange
    var mockStore = MockRepository.GenerateMock<IStore>();
    mockStore.Expect(x => x.Commit());
    //here i want to set an expectation that x.Rollback() should not be called.

    //Act
    subject.Commit();

    //Assert
    mockStore.VerifyAllExpectation();
}
Run Code Online (Sandbox Code Playgroud)

当然,我可以在Assert阶段这样做:

mockStore.AssertWasNotCalled(x => x.Rollback());
Run Code Online (Sandbox Code Playgroud)

但我想首先将此作为期望.

c# unit-testing rhino-mocks

23
推荐指数
2
解决办法
1万
查看次数

RhinoMock:模拟Vs StrictMocks和DynamicMocks

我理解Mock和Stub之间的区别.

但是RhinoMock框架中不同类型的模拟混淆了我.

有人可以用RhinoMock框架来解释Mocks Vs StrictMocks和DynamicMocks的概念.

非常感谢您的回答.

tdd rhino-mocks mocking

22
推荐指数
1
解决办法
1万
查看次数

对Rhino模拟方法的多次调用会返回不同的结果

如果我想模拟一个返回一个字符串的类,该字符串用于确定while循环是否应该继续(想象读取字符串!= null),我该如何设置期望值.我尝试过以下方法:

    provider.Reader.Expect(r => r.ReadLine()).Return("1,10,20");
    provider.Reader.Expect(r => r.ReadLine()).Return(null);
Run Code Online (Sandbox Code Playgroud)

但是当它在同一个方法中被调用两次时,它会在两种情况下返回第一个字符串,而我希望它在第二次调用时返回第二个值(null).

rhino-mocks

21
推荐指数
1
解决办法
6028
查看次数

Rhino Mocks存根和模拟只适用于接口?

Rhino Mocks存根和模拟只对接口有用,而不是具体的类吗?我花了很多时间试图让这段代码工作.我没想到存根的pubSubClient总是从类中调用Send方法.该方法有一些依赖项并抛出异常.

[Test]
public void Test01()
{
    PubSubMessage psm = new PubSubMessage(); 
    var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
    pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
    // actual PubSubClient Send method throws exception
    // the rest of the test is skipped...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我提取界面并使用IPubSubClient运行相同的测试时,它似乎按预期工作.

这是否意味着我必须为我想要使用Rhino模拟/存根的每个类提取接口?或者我在技术上或概念上遗漏了什么?

更新:好的,我似乎弄清楚了我缺少的部分: Rhino Mocks无法拦截对非虚方法的调用.所以,我想我要么使用接口,要么在具体类虚拟上使用每个方法.如果还有其他选择,请纠正我.

.net unit-testing rhino-mocks mocking stubbing

21
推荐指数
1
解决办法
1万
查看次数

RhinoMocks - 模拟一个方法,其返回值随多次调用而改变(即使传递相同的参数)

我想找出如何模拟一个方法,它在第二次调用它时第二次返回一个不同的值.例如,像这样:

public interface IApplicationLifetime
{
    int SecondsSinceStarted {get;}
}

[Test]
public void Expected_mock_behaviour()
{
    IApplicationLifetime mock = MockRepository.GenerateMock<IApplicationLifetime>();

    mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
    mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();

    Assert.AreEqual(1, mock.SecondsSinceStarted);
    Assert.AreEqual(2, mock.SecondsSinceStarted);
}
Run Code Online (Sandbox Code Playgroud)

有什么能使这成为可能吗?除了为实现状态机的getter实现一个sub?

干杯fellas,

亚历克斯

c# unit-testing rhino-mocks mocking

21
推荐指数
2
解决办法
2万
查看次数

犀牛嘲笑 - 使用Arg.Matches

我有一个我正在模拟的函数,它将一个参数对象作为参数.我想根据对象中的值返回结果.我无法比较对象,因为Equals没有被覆盖.

我有以下代码:

_tourDal.Stub(x => x.GetById(Arg<TourGet>.Matches(y => y.TourId == 2), null)).Return(
                new Tour() 
                {
                    TourId = 2,
                    DepartureLocation = new IataInfo() { IataId = 2 },
                    ArrivalLocation = new IataInfo() { IataId = 3 }
                });
Run Code Online (Sandbox Code Playgroud)

这应该返回当提供的参数的TourId为2时指定的对象.

这看起来应该可以工作,但是当我运行它时,我得到以下异常:

使用Arg时,必须使用Arg.Is,Arg.Text,Arg.List,Arg.Ref或Arg.Out定义所有参数.预期有2个参数,1个已被定义.

我需要做些什么来解决这个问题?

.net c# unit-testing rhino-mocks

20
推荐指数
2
解决办法
2万
查看次数

呼叫无效,最后一次呼叫已被使用或未进行任何呼叫

当我尝试设置模拟时,我收到此错误PropertyBehavior():

System.InvalidOperationException:System.InvalidOperationException:无效调用,最后一次调用已被使用或未进行任何调用(请确保您正在调用虚拟(C#)/ Overridable(VB)方法).

我试图只使用Rhino Mocks 3.5(安排,行动,断言)

这是我的代码:

    private IAddAddressForm form;

    private AddAddressMediator mediator;

    [TestInitialize()]
    public void MyTestInitialize()
    {
        form = MockRepository.GenerateMock<IAddAddressForm>();
        mediator = new AddAddressMediator(form);


        // Make the properties work like a normal property
        Expect.Call(form.OKButtonEnabled).PropertyBehavior();

        //I tried this too.  I still get the exception
        //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
    }


    [TestMethod]
    public void TestOKButtonEnabled()
    {

        form.OKButtonEnabled = true;
        Assert.IsTrue(form.OKButtonEnabled);
    }
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用存根(对于我应该使用的代码),但我正在尝试学习Rhino Mocks.

最终,我希望能够确保访问多个属性的值.(关于如何检查form.FirstName访问的任何提示(即调用getter)也将不胜感激.)

如果需要,以下代码IAddressForm:

namespace AddressBook
{
    public interface IAddAddressForm
    {
        string FirstName { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# rhino-mocks visual-studio-2008 visual-studio rhino-mocks-3.5

19
推荐指数
1
解决办法
2万
查看次数

RhinoMock vs. TypeMock vs. NUnit的Mocking?

我刚开始做测试驱动开发,我想知道RhinoMock,TypeMock和NUnit的内置模拟之间的主要区别?

任何信息将不胜感激!

nunit unit-testing rhino-mocks typemock mocking

19
推荐指数
3
解决办法
1万
查看次数

有没有类似TypeMock的开源模拟框架?

TypeMock对于像我这样的爱好者来说太贵了:)

Moq或下一版RhinoMocks没有计划收听分析API,为什么会这样?

编辑:这启用以下功能:

  • 模拟非虚方法和属性(!).
  • 模拟浏览器环境.
  • 更简单的语法,不易碎(并且不必通过模拟对象).
  • 模拟静态方法有时很有用(主要是在遗留场景中,涉及可怕的DateTime.Now).
  • 还有更多 ......

.net tdd unit-testing rhino-mocks moq

19
推荐指数
3
解决办法
2425
查看次数

如何正确使用Rhino.Mocks AssertWasCalled()?

我打电话_mocks.ReplayAll(),然后一个或多个_mockedObject.AssertWasCalled()然后_mocks.VerifyAll().但它告诉我"当模拟对象处于记录状态时,此操作无效".

[Test]
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused()
{
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused };
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused));
    _mockRepository.ReplayAll();
    _manager.SetStateExecuting(task);
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                                                                  TaskState.Executing));
    _mockRepository.VerifyAll();
}
Run Code Online (Sandbox Code Playgroud)

调用正确的顺序是什么,以便这些方法正常工作?

c# nunit assert rhino-mocks

18
推荐指数
3
解决办法
3万
查看次数