使用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)
但我想首先将此作为期望.
我理解Mock和Stub之间的区别.
但是RhinoMock框架中不同类型的模拟混淆了我.
有人可以用RhinoMock框架来解释Mocks Vs StrictMocks和DynamicMocks的概念.
非常感谢您的回答.
如果我想模拟一个返回一个字符串的类,该字符串用于确定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存根和模拟只对接口有用,而不是具体的类吗?我花了很多时间试图让这段代码工作.我没想到存根的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无法拦截对非虚方法的调用.所以,我想我要么使用接口,要么在具体类虚拟上使用每个方法.如果还有其他选择,请纠正我.
我想找出如何模拟一个方法,它在第二次调用它时第二次返回一个不同的值.例如,像这样:
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,
亚历克斯
我有一个我正在模拟的函数,它将一个参数对象作为参数.我想根据对象中的值返回结果.我无法比较对象,因为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个已被定义.
我需要做些什么来解决这个问题?
当我尝试设置模拟时,我收到此错误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
我刚开始做测试驱动开发,我想知道RhinoMock,TypeMock和NUnit的内置模拟之间的主要区别?
任何信息将不胜感激!
TypeMock对于像我这样的爱好者来说太贵了:)
Moq或下一版RhinoMocks没有计划收听分析API,为什么会这样?
编辑:这启用以下功能:
我打电话_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)
调用正确的顺序是什么,以便这些方法正常工作?