使用rspec和factory_girl测试查询:有更好的方法吗?

时间:2014-02-03 05:59:47

标签: ruby-on-rails testing rspec mocking factory-bot

我有以下类和关系

City has_many Cinemas
Cinemas has_many Movies
Movies has_many Ratings
Movies Has_many Genres through GenreMovie 

我想测试像

这样的查询
* Show me the all movies in NewYork 
* Show me the all movies in NewYork order by the rating 
* Show me the all movies in NewYork order by length_of_movie, in genre "Action" 
* show me all movies in Cinema "X" order by rating, that are in Genre "SciFi"

目前我的方式如下,使用工厂女孩,并将一堆模型链接在一起以检查数据,

city = create(:city)
cinema = create(:cinema, city: city)
5.times do 
    movie = create(:movie, cinema: cinema, tags: ["sci fi", "action"]
    3.times do 
        create(:rating, score: 2.3, movie: movie)
    end 
end 

并重复3-4以生成足够的数据来查询,但它似乎很笨重。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我通常使用非常“简约”的方法对此进行测试:

e.g。对于你的第一个案例,我会制作两部电影,一部分在纽约,一部分在外面。你的方法应该只返回NY中的那个

第二部分,在纽约制作三部电影,评分不同。以非逻辑方式创建它们,这样无论如何,它们都将被排序。检查您的方法是否按正确顺序返回

与其他案件相似。

我不会只创建5x3电影。没有任何意义,只花费时间......

答案 1 :(得分:0)

您可以使用几种factory_girl构造来清理它们。 create_list将创建一个对象数组,清理x.times do块。 with_ratings工厂的movie特性可让您选择在创建电影时自动创建评级(通过FactoryGirl回调)。您甚至可以使用瞬态属性来控制数量和评级。所以你的结果看起来像这样:

cinema = create(:cinema)
movies = create_list(
  :movie, 
  5, 
  :with_ratings, 
  cinema: cinema, 
  tags: [...], 
  ratings_count: 3, 
  ratings_value: 2.3
)

如果您需要访问该城市,可以通过cinema.city

获取

请参阅: