티스토리 툴바


오늘 조금 해맸던 부분 정리

이 테스트는 model 단계 테스트에서 사용하기 좋다.

더 복잡한 상위 단계에서 하게 되면, 테스트에서 해당 instance가 어떤 message를 받았는지 ( 어떤 함수를 호출했는지 ) 가 확실하지 않게 된다. 항상 테스트에서 should_receive 함수가 호출되기 전에 선언해야 한다. 가장 먼저 받는 message (함수)를 테스트할 때, 확실한것 같다. controller단계에서는 잘 테스트가 되지 않는다.

약간 내용을 정정 하자면, 테스트에서 사용되는 인스턴스와 실제 코드의 인스턴스가 같아야 한다.
모델을 직접 사용하는 경우는 괜찮으나, 인스턴스를 가져오는 경우, 테스트와 실제코드가 인스턴스가 다르다. 이유는 실제코드에서는 매번 내부적으로 find함수를 통해서 새로 가져오기 때문이다.

user.should_receive(:update_attribute)
: user instance는 update_attribute함수를 호출하게 됨.

user.should_receive(:update_attribute).once
: user instance는 update_attribute함수를 한번만 호출하게 됨.
* 주의 사항 : 이 걸 사용했을 경우, 해당 함수 리턴값이 nil이 된다. return값이 테스트에
필요한 경우, 반드시 and_return함수를 사용해서 return값을 지정한다.

user.should_receive(:update_attribute).and_return(true)
: user instance는 update_attribute함수를 호출하고, true를 return함. ( 이는 결과를 테스트 하는 것이 아니라, 테스트 중 실행결과에 상관없이 true를 return하게 함.

사실 많은 책에서 언급되었던 것인데, 이제 와서 확인 할 수 있었다.

rspec 2.6부터 any_instance가 추가된 관계로 find를 stub할 필요가 없어졌다. 
Posted by styner
Postgres에는 table안에서 set을 정해서, 그 안에서 연산이 가능하다.

Mysql에는 row_num이 있어서, select 후에 그 번호를 이용해서,

조건을 줄 수 있었는데, postgres에서는 row_num을 직접 쓸 수 있는 방법이 없었다.

그런데 window function을 쓰면 가능하다.

예를 들면, user table에서 지역 별로 가장 나이가 많은 사람들 뺀 나머지 사람들을 구하고 싶다고 하면,

SELECT id

FROM

  (SELECT id, rank() OVER (PARTITION BY region ORDER BY age DESC) AS pos

    FROM users

  ) AS ss

WHERE pos > 1; 

다음과 같이 하면 구할 수 있다.

http://www.postgresql.org/docs/devel/static/tutorial-window.html

참고하면 된다. 
Posted by styner
select id from users where id IN (56, 77, 99) order by id = 56 desc, id = 77 desc, id = 99;

select id from users where id IN (56, 77, 99) order by CASE id WHEN 56 THEN 1 WHEN 77 THEN 2 WHEN 99 THEN 4 ELSE 5 END;

select id, CASE id WHEN 56 THEN 1 WHEN 77 THEN 2 WHEN 99 THEN 3 ELSE 4 END as id_order from users where id IN (56, 77, 99) order by id_order;

                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=24.79..24.79 rows=3 width=4) (actual time=0.049..0.049 rows=3 loops=1)
   Sort Key: (CASE id WHEN 56 THEN 1 WHEN 77 THEN 2 WHEN 99 THEN 3 ELSE 4 END)
   Sort Method:  quicksort  Memory: 25kB
   ->  Bitmap Heap Scan on users  (cost=12.83..24.76 rows=3 width=4) (actual time=0.038..0.041 rows=3 loops=1)
         Recheck Cond: (id = ANY ('{56,77,99}'::integer[]))
         ->  Bitmap Index Scan on users_pkey  (cost=0.00..12.83 rows=3 width=0) (actual time=0.022..0.022 rows=3 loops=1)
               Index Cond: (id = ANY ('{56,77,99}'::integer[]))
 


3개 다 같은 plan으로 검색함.

hash를 이용해서 { index => value }로 설정해서 나중에 정렬하는 것 같음.

2번째 방법이 깜끔 
Posted by styner