无法使Rhino Mocks返回正确的类型

时间:2011-07-20 20:30:21

标签: rhino-mocks

我刚刚开始了一项新工作,我要求做的第一件事就是为代码库构建单元测试(我现在工作的公司致力于自动化测试,但他们主要进行集成测试和构建需要永远完成)。

所以一切都很顺利,我开始在这里和那里打破依赖关系并开始编写单独的单元测试但现在我遇到了一个问题,犀牛模拟无法处理以下情况:

//authenticationSessionManager is injected through the constructor.  
var authSession = authenticationSessionManager.GetSession(new Guid(authentication.SessionId));

((IExpirableSessionContext)authSession).InvalidateEnabled = false;

GetSession方法返回的类型是SessionContext,您可以看到它被转换为IExpirableSessionContext接口。

还有一个ExpirableSessionContext对象,它继承自SessionContext并实现IExpirableSessionContext接口。

会话对象的存储和检索方式如下所示:

private readonly Dictionary<Guid, SessionContext<TContent>> Sessions= new Dictionary<Guid, SessionContext<TContent>>(); 

public override SessionContext<TContent> GetSession(Guid sessionId)
{
    var session = base.GetSession(sessionId);

    if (session != null)
    {
        ((IExpirableSessionContext)session).ResetTimeout();
    }

    return session;
}

public override SessionContext<TContent> CreateSession(TContent content)
{
    var session = new ExpirableSessionContext<TContent>(content, SessionTimeoutMilliseconds, new TimerCallback(InvalidateSession));

    Sessions.Add(session.Id, session);            

    return session;
}

现在我的问题是当我模拟对GetSession的调用时,即使我告诉rhino mocks返回ExpirableSessionContext&lt; ...&gt;对象,测试在它被转换到IExpirableSession接口的行上抛出一个异常,这是我测试中的代码(我知道我使用的是旧语法,请在这个问题上耐心等待):

Mocks = new MockRepository();
IAuthenticationSessionManager AuthenticationSessionMock;
AuthenticationSessionMock = Mocks.DynamicMock<IAuthenticationSessionManager>();

var stationAgentManager = new StationAgentManager(AuthenticationSessionMock);

var authenticationSession = new ExpirableSessionContext<AuthenticationSessionContent>(new AuthenticationSessionContent(AnyUserName, AnyPassword), 1, null);

using (Mocks.Record())  
{
   Expect.Call(AuthenticationSessionMock.GetSession(Guid.NewGuid())).IgnoreArguments().Return(authenticationSession);  
}

using (Mocks.Playback())  
{  
    var result = stationAgentManager.StartDeploymentSession(anyAuthenticationCookie);
    Assert.IsFalse(((IExpirableSessionContext)authenticationSession).InvalidateEnabled);  
}

我认为转换失败是有道理的,因为该方法返回不同类型的对象并且生产代码有效,因为会话被创建为正确的类型并存储在字典中,该字典是测试永远不会运行的代码,因为它正在被嘲笑。

如何设置此测试才能正常运行?

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

事实证明一切正常,问题是在每次测试的设置上都有对该方法调用的期望:

Expect.Call(AuthenticationSessionMock.GetSession(anySession.Id)).Return(anySession).Repeat.Any();

所以这个期望超越了我在自己的测试中设定的那个。我不得不将这种期望从安装方法中取出,将其包含在辅助方法中,并让所有其他测试使用此方法。

一旦开始,我的测试就开始了。