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

使用Rhino mock设置存根方法返回值的技术差异

  •  2
  • CRice  · 技术社区  · 16 年前

    所以(第一个),

    using (test.Record()) //test is MockRepository instance
    {
     service.GetUser("dummyName");
     LastCall.Return(new LoginUser());
    }
    

    vs(第二个)。

    service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser());
    

    编辑

    问题是第二种技术在测试中返回null,而我希望它返回一个新的LoginUser。第一种技术通过返回一个新的登录用户来实现预期的效果。在这两种情况下使用的所有其他测试代码都是相同的。

    [TestFixture]
    public class AuthorizationTest
    {
        private MockRepository test;
        private IMembershipService service;
    
        [SetUp]
        public void SetUp()
        {
            test = new MockRepository();
            service = test.Stub<IMembershipService>();
    
            using (test.Record())
            {
                service.GetUser("dummyName");
                LastCall.Return(new LoginUser());
            }
    
            //service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
        }
    
        [Test]
        public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
        {
            var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);
    
            LoginUser u = authStub.GetCurrentUser();
            Assert.That(u != null);
        }
    
        [TearDown]
        public void TearDown()
        {
            service = null;
            test = null;
        }
    }
    

    这可能与接口中的过载有关吗?

    public interface IMembershipService
    {
        bool ChangePassword(string username, string oldPassword, string newPassword);
        LoginUser GetUser(string username);
        LoginUser GetUser(object providerUserKey);
        string ResetPassword(string username);
        bool ValidateUser(string username, string password);
    }
    

    LoginUser currentUser = _repository.GetUser(identity.Name);
    

    在调试模式下,identity.Name从不为null,并且始终为“dummyName”

    1 回复  |  直到 16 年前
        1
  •  3
  •   Sam Holder Brian Adams    16 年前

    第二种方法是新的 AAA syntax

    编辑:

    是否确定正在使用该参数调用该方法?如果你使用

     service.Stub(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());
    

    有没有退货?

    如果你设置了一个期望值,而不是简单地将其存根,然后验证期望值,这会给你更多的信息吗?

    service.Expect(r => r.GetUser(Arg<String>.Is.Anything)).Return(new LoginUser());
    service.VerifyAllExpectations();
    

    编辑2:

    好吧,我做了一些测试,看起来这就是你创建存根对象的方式。我假设您使用的方式是旧样式,您需要将此用于新样式:

    service = MockRepository.GenerateStub<IMembershipService>();
    

    当我改成这个,我可以运行测试,让他们通过。我不确定使用静态方法生成存根和使用测试之间的确切区别 MockRepository 实例。也许其他人可以解释一下事情的来龙去脉。

    总之,为了完整起见,下面是我运行的代码:

    [TestFixture]
    public class AuthorizationTest
        {
        private IMembershipService service;
    
        [SetUp]
        public void SetUp()
            {
            service = MockRepository.GenerateStub<IMembershipService>();
            service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser()); 
            }
    
        [Test]
        public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
            {
            var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);
    
            LoginUser u = authStub.GetCurrentUser();
            Assert.That(u != null);
            }
    
        [TearDown]
        public void TearDown()
            {
            service = null;
            }
        }
    
    public class AuthorizationStub_SetCurrentUserAuthenticated
        {
        private readonly IMembershipService m_service;
        private readonly bool m_b;
    
        public AuthorizationStub_SetCurrentUserAuthenticated (IMembershipService service, bool b)
            {
            m_service = service;
            m_b = b;
            }
    
        public LoginUser GetCurrentUser ()
            {
            return m_service.GetUser ("dummyName");
            }
        }
    
    public interface IMembershipService
        {
        bool ChangePassword(string username, string oldPassword, string newPassword);
        LoginUser GetUser(string username);
        LoginUser GetUser(object providerUserKey);
        string ResetPassword(string username);
        bool ValidateUser(string username, string password);
        }
    
    public class LoginUser
        {
        }
    
    推荐文章