Table of Contents [Hide/Show]
What's New in Rhino Mocks 3.5Usage Guidance The difference between stubs and mocks CreateMock is deprecated, replaced by StrictMock. The use of Strict Mock is discouraged.Mocking with and without an instance of MockRepositoryArrange, Act, Assert Expect and Stub Extension Methods Expect() Extension Method Stub() Extension Method Using Expect() to set up properties What is the difference between GenerateStub and GenerateMockUsing the AAA syntax in C# 2.0Argument Constraints Simple Constraints Inline constraints Ignoring arguments Shortcut to Equal Properties Event registration Complex expressions Out and Ref arguments Constraints ReferenceHow to raise eventsProperty Setters Explicit Expectation APIAccessing the method arguments directlyRecursive mocking
public void When_user_forgot_password_should_reset_password() { var stubUserRepository = MockRepository.GenerateStub<IUserRepository>(); var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>(); var theUser = new User{HashedPassword = "this is not hashed password"}; stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); var controllerUnderTest = new LoginController(stubUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); Assert.AreNotEqual("this is not hashed password", theUser.HashedPassword); }
public void ForgotMyPassword(string username) { var user = users.GetUserByName(username); user.HashedPassword = "new pass"; }
public void When_user_forgot_password_should_save_user() { var mockUserRepository = MockRepository.GenerateMock<IUserRepository>(); var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>(); var theUser = new User{HashedPassword = "this is not hashed password"}; mockUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); mockUserRepository.Expect( x => x.Save(theUser) ); var controllerUnderTest = new LoginController(mockUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); mockUserRepository.VerifyAllExpectations(); }
public void ForgotMyPassword(string username) { var user = users.GetUserByName(username); user.HashedPassword = "new pass"; users.Save(user); }
public void When_user_forgot_password_should_save_user() { var stubUserRepository = MockRepository.GenerateStub<IUserRepository>(); var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>(); var theUser = new User{HashedPassword = "this is not hashed password"}; stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); var controllerUnderTest = new LoginController(stubUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); stubUserRepository.AssertWasCalled( x => x.Save(theUser)); }
public void When_user_forgot_password_should_sms_user() { var stubUserRepository = MockRepository.GenerateStub<IUserRepository>(); var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>(); var theUser = new User{HashedPassword = "this is not hashed password", Phone = "1234-1234"}; stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); var controllerUnderTest = new LoginController(stubUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); stubbedSmsSender.AssertWasCalled( x => x.Send( Arg.Is.Equal("1234-1234"), Arg.Text.StartsWith("Password was changed to:") )); }
public void ForgotMyPassword(string username) { var user = users.GetUserByName(username); user.HashedPassword = "new pass"; users.Save(user); smsSender.Send(user.Phone, "Password was changed to: new pass"); }
mockRepository.CreateMock<ISmsSender>()
CreateMock()
StrictMock()
public void When_user_forgot_password_should_save_user() { var mocks = new MockRepository(); var mockUserRepository = mocks.DynamicMock<IUserRepository>(); var stubbedSmsSender = mocks.GenerateStub<ISmsSender>(); using(mocks.Record()) { var theUser = new User{HashedPassword = "this is not hashed password"}; mockUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); mockUserRepository.Expect( x => x.Save(theUser) ); } using(mocks.Playback()) { var controllerUnderTest = new LoginController(mockUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); } }
MockRepository.GenerateMock()
MockRepository.GenerateStub()
public void When_user_forgot_password_should_save_user() { // arrange var stubUserRepository = MockRepository.GenerateStub<IUserRepository>(); var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>(); var theUser = new User{HashedPassword = "this is not hashed password"}; stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); // act var controllerUnderTest = new LoginController(stubUserRepository, stubbedSmsSender); controllerUnderTest.ForgotMyPassword("ayende"); // assert stubUserRepository.AssertWasCalled( x => x.Save(user)); }
Test public void should_sign_out_of_the_auth_service_when_the_logout_action_is_invoked() { IAuthService authSvc = MockRepository.GenerateMock(); authSvc.Expect(svc => svc.SignOut()).Return(true); SignoutControllercontroller = new SignoutController(authSvc); controller.SignOut(); authSvc.VerifyAllExpectations(); }
public void SignOut() { if (authSvc.Signout()) notificationSvc.UserIsLoggedOut(); }
Test public void should_notify_when_user_sign_out_successfully() { IAuthService authSvc = MockRepository.GenerateStub<IAuthService>(); INotificationService notificationSvc= MockRepository.GenerateMock<INotificationService>(); authSvc.Stub(svc => svc.SignOut()).Return(true); // This also works for mock objects notificationSvc.Expect((o => o.UserIsLoggedOut()); SignoutController controller = new SignoutController(authSvc, notificationSvc); controller.SignOut(); notificationSvc.VerifyAllExpectations(); }
Test public void should_notify_when_user_sign_out_successfully() { IAuthService authSvc = MockRepository.GenerateStub<IAuthService>(); INotificationService notificationSvc= MockRepository.GenerateMock<INotificationService>(); authSvc.Stub(svc => svc.SignOut()).Return(true); SignoutController controller = new SignoutController(authSvc, notificationSvc); controller.SignOut(); notificationSvc.AssertWasCalled(x=>x.UserIsLoggedOut()); }
public void RunView_Returns_the_View_List { //Arrange List<string> expectedlist = new List<string>(); expectedlist.Add("Ayende"); expectedlist.Add("Tom"); Form Parent = null; //Stub, the parent doesn't matter for this test. IGetNamesView mockview = MockRepository.GenerateMock<IGetNamesView>(); mockview.Expect(view => view.ShowDialog(Parent)).Return(DialogResult.OK); mockview.Expect(view => view.Names).Return(expectedlist); //Mock for the property getter GetNameController target = new GetNameController(Parent, mockview); List<string> actual; //Act actual = target.RunVeiw(); //Assert mockview.VerifyAllExpectations(); Assert.AreEqual(expectedlist, actual);
Test public static void Test_Using_Extension_Methods_Using_2_0() { IAuthService authSvc = MockRepository.GenerateStub(); INotificationService notificationSvc = MockRepository.GenerateMock(); RhinoMocksExtensions.Expect(notificationSvc , delegate(INotificationService o) { o.UserIsLoggingOut(); }); RhinoMocksExtensions.Stub(authSvc, delegate(IAuthService svc) { svc.SignOut(); }).Return(true); SignoutController controller = new SignoutController(authSvc, notificationSvc); controller.SignOut(); RhinoMocksExtensions.VerifyAllExpectations(notificationSvc);}Test public void Test_Using_AAA_Using_2_0() { IAuthService authSvc = MockRepository.GenerateStub(); INotificationService notificationSvc = MockRepository.GenerateMock(); RhinoMocksExtensions.Stub(authSvc, delegate(IAuthService svc) { svc.SignOut(); }).Return(true); SignoutController controller = new SignoutController(authSvc, notificationSvc); controller.SignOut(); RhinoMocksExtensions.AssertWasCalled(notificationSvc, delegate(INotificationService x) { x.UserIsLoggingOut(); });}
stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser);
stubUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser); Assert.IsNull(stubUserRepository.GetUserByName("stefan")); Assert.AreSame(theUser, stubUserRepository.GetUserByName("ayende"));
IgnoreArguments()
stubUserRepository.Stub(x => x.GetUserByName(null)) .IgnoreArguments() .Return(theUser);
null
(string)null
Constraints()
RefOut()
Arg<T>
stubUserRepository.Stub(x => x.GetUserByName(Arg<string>.Is.Equal("ayende"))).Return(theUser); Assert.IsNull(stubUserRepository.GetUserByName("stefan")); Assert.AreSame(theUser, stubUserRepository.GetUserByName("ayende"));
stubUserRepository.Stub(x => x.GetUserByName(Arg<string>.Is.Anything)).Return(theUser); Assert.AreSame(theUser, stubUserRepository.GetUserByName("stefan")); Assert.AreSame(theUser, stubUserRepository.GetUserByName("ayende"));
Arg.Is<T>(T)
Arg<T>.Is.Equal(object)
stubUserRepository.Stub(x => x.GetUserByName(Arg.Is("Ayende"))).Return(theUser);
customerMock.Name = "Steinegger"; customerMock.AssertWasCalled(x => x.Name = Arg<string>.Is.NotNull);
string name = customerMock.Name; customerMock.AssertWasCalled(x => {var ignored = x.Name;});
mock.Load += OnLoad; mock.AssertWasCalled(x => x.Load += Arg<LoadEvent>.Is.Anything);
Arg<T>.Matches
// using lamda with .NET string evaluation (string.StartsWith)stubUserRepository.Stub(x => x.GetUserByName(Arg<string>.Matches(y => y.StartsWith("aye", StringComparison.InvariantCulture) || y.StartsWith("stein", StringComparison.InvariantCulture))) .Return(theUser); Assert.AreSame(theUser, stubUserRepository.GetUserByName("steinegger")); Assert.AreSame(theUser, stubUserRepository.GetUserByName("ayende"));
//using Rhino Constraints to build the expressionstubUserRepository.GetUserByName("ayende"); stubUserRepository.GetUserByName("steinegger");stubUserRepository.Stub(x => x.GetUserByName(Arg<string>.Matches(Text.StartsWith("aye") || Text.StartsWith("stein"))) .Return(theUser); Assert.AreSame(theUser, stubUserRepository.GetUserByName("steinegger")); Assert.AreSame(theUser, stubUserRepository.GetUserByName("ayende"));
ref
out
User user; if (stubUserRepository.TryGetValue("Ayende", out user)) { //... } stubUserRepository.Stub(x => x.TryGetValue( Arg.Is("Ayende"), out Arg<User>.Out(new User()).Dummy)) .Return(true);
Arg.Out(new User())
new User()
Dummy
User user; if (someMock.Foo(ref str)) { //... } someMock.Stub(x => x.Foo(ref Arg<string>.Ref(Is.Equal("Stefan"), "Oren").Dummy)) .Return(true);
Arg<string>.Ref(Is.Equal("Stefan"), "Oren")
Arg<string>.Is.Matching(delegate(string s) { return s.Length == 2; }
Arg<int>.Matches(x => x > 3)
Arg<int>.Matches(Is.GreaterThan(0) && Is.LessThan(10))
[Test] public void RaisingEventOnView() { var mocks = new MockRepository(); IView view = mocks.CreateMock<IView>(); view.Load+=null;//create an expectation that someone will subscribe to this event LastCall.IgnoreArguments();// we don't care who is subscribing IEventRaiser raiseViewEvent = LastCall.GetEventRaiser();//get event raiser for the last event, in this case, View mocks.ReplayAll(); Presenter p = new Presenter(view); raiseViewEvent.Raise(); Assert.IsTrue(p.OnLoadCalled); }
[Test] public void RaisingEventOnViewUsingExtensionMethod() { var mocks = new MockRepository(); IView view = mocks.DynamicMock<IView>(); Presenter p = new Presenter(view); view.Raise(x => x.Load += null, this, EventArgs.Empty); Assert.IsTrue(p.OnLoadCalled); }
Raise()
view.Load
x => x.Load += null
var wasCalled = false; var stub = MockRepository.GenerateStub(); stub.Stub(x => x.StringArgString(Arg.Is(""))) .Return("blah") .WhenCalled(delegate { wasCalled = true; }); Assert.AreEqual("blah", stub.StringArgString("")); Assert.IsTrue(wasCalled);
Test public void Can_modify_return_value() { var stub = MockRepository.GenerateStub(); stub.Stub(x => x.StringArgString(Arg.Is(""))) .Return("blah") .WhenCalled(invocation => invocation.ReturnValue = "arg"); Assert.AreEqual("arg", stub.StringArgString("")); }Test public void Can_inspect_method_arguments() { var stub = MockRepository.GenerateStub(); stub.Stub(x => x.StringArgString(null)) .IgnoreArguments() .Return("blah") .WhenCalled(invocation => Assert.AreEqual("foo", invocation.Arguments0)); Assert.AreEqual("blah", stub.StringArgString(" }