我遇到这个问题与测试.假设我有两个模型,用户和帖子,其中user has_many:posts.
user = User.find(123) post = user.posts.find(456)
我知道如何嘲笑User.find和user.posts部分. user.posts mock返回一个Post对象数组.当它得到.find(456)的一部分时,所有的事情都会被分解,没有给定例外.
所以我的问题是:由于user.posts模拟的结果返回的是什么,所以.find(456)方法可以工作吗? User.first.posts.class表示它是Array,但显然有更多的东西可以使AR风格的查找调用工作.我不喜欢在返回的对象上嘲笑find方法的前景.
PS在你建议一个明显和好的答案,停止嘲笑和使用夹具/种子测试数据库与必要的数据,这里是catch:遗留方案.用户和后台都可以在数据库视图之上进行工作,而不是在表中进行更改,并将其更改为测试数据库中的表格似乎错误.
解决方法
问题是user.posts实际上并不是一个简单的数组;它是一个关联代理对象.存储它的方式可能是这样的(尽管确切的语法取决于您使用的嘲笑框架):
def setup @user = mock(User) User.stub(:find).with(123).return(@user) user_posts = mock(Object) @user.stub(:posts).return(user_posts) @post = mock(Post) user_posts.stub(:find).with(456).return(@post) end
然后在你的测试中,User.find(123)将返回@user和@ user.posts.find(456)将返回@post.如果您需要@ user.posts在测试中像更多的Array一样,您可以创建一个mock(Array)并存放[](index)方法.