2017-11-03 5 views
0

스트라이프 API를 사용하여 레일 애플리케이션을 테스트하려고합니다. 모델로 시작했기 때문에 Rspec을 사용하고 있습니다. 테스트하려는 모델은 거기에 bank_account.rb라고합니다. 나는이 기능을 테스트하기 시작했을 때테스트 기능에 API 요청이 포함되어 있습니다.

def create_bank_account(bank_token) 
    # make a Stripe request and save it in local variable 
    # save needed data in my bank_account table in my DB 
end 

, 나는 좋지 않아 그 내부 API 호출이 있음을 발견 : 인수 (bank_token)와 (create_bank_account)라는 함수의 의사는이 같은 것입니다입니다 나는 인터넷에 의존하지 않는 테스트가 필요하다. 그래서 검색 한 후에 나는 'StripeMock` 보석을 발견했다. 유용하고 Rspec과 함께 사용하기 시작했다. 그러나 내 자신이 다음과 같은 테스트를 작성했다.

it 'with valid bank_token` do 
    # create a double for bank_account 
    # using StripeMock to get a faked response for creating 
    # new bank_account 
    # expect the doube to receive create_bank_account 
    # function and response with saving the data inside the DB 
end 

하지만 난 사실은 내가 그것을 위조 create_bank_account 기능을 실행하지 않은, 그래서 내 질문은 것으로 나타났습니다이 작성 후 :

1- 어떻게 API 요청을 포함 기능을 테스트하지만, 기능 그 자체를 실행할 수 있습니다 그것을 위조하지 않습니까?

2 우리가 double과 stub을 사용할 때 많이 읽었습니다. 함수가 완료되지 않았을 때 함수가 완료되지 않았지만 함수가 이미 구현되어 있으면 API를 호출하는 함수와 같은 것을 피하기 위해 double을 사용해야합니까? 무엇보다도

+0

스텁을 API 호출로 사용할 수는 있지만 함수 자체가 아닙니다.예를 들어 api가 Sendgrid.send()를 호출하면, Sendgrid.stub (: send) .with ('more_than', 'one_argument')에 의해 그만 쓴다. –

답변

1

첫 번째와는 :

  • bank_account double를 만들지 마십시오.
  • 모의하지 말고/스텁 bank_account.create_bank_account.

그런 다음 테스트가 쓸모가, BankAccount#create_bank_account의 테스트 동작 있어야 하는 시험에서, 이러한 것들 중 하나를 수행합니다.

(이 점을 증명하기 위해, 당신의 검사 결과가 분명 실패합니다. 방법에 깨진 코드를 작성하려고합니다. 그러나이 방법을 조롱하는 경우, 모든 !! 통과 유지됩니다)

한 가지 방법을 또는 다른 경우, stripe 요청을 조롱해야합니다. 즉 응용 프로그램과 인터넷 사이에 경계 인의 동작을 조롱해야합니다. 다음

def create_bank_account(bank_token) 
    stripe_request = make_stripe_request(bank_token) 
    # save needed data in my bank_account table in my DB 
end 

private 

def make_stripe_request(bank_token) 
    # ... 
end 

... 그리고 :

나는 좀 더 정보없이 작업 코드 샘플을 제공하지만 대체로이에서 코드를 리팩토링 수 말할 수 없습니다 이것에

def create_bank_account(bank_token) 
    # make a Stripe request and save it in local variable 
    # save needed data in my bank_account table in my DB 
end 

테스트에서 use StripeMock ~ BankAccount#make_stripe_request의 가짜 응답을 만들 수 있습니다.

코드가 리팩터링하기 쉽지 않으면 (?!) Stripe 라이브러리를 직접 스터 빙하면 실용적이지 않을 수 있습니다. 당신이 항상 취할 수있는 대체 접근법은 webmock과 같은 라이브러리를 사용하여 모든 HTTP 호출을 가로 채기 만하면됩니다.

+0

새로운 [은행 계좌] (https://www.ideone.com/I5WUhg)를 만들 것을 요청하고, ID와 은행 이름을 내 DB에 저장하고 있습니다. 그렇다면 답을 통해서만 make_stripe_request를 테스트하고 테스트하지 말아야합니다. create_bank_account? 내가 맞습니까? –

+0

내가 무슨 뜻인지는 create_bank_account 맞습니까? create_bank_account의 모든 행이 실행되어야합니다. 가능한가요? 또는 실제 서버를 호출하고 싶지 않기 때문에 가능하지 않습니까? 감사합니다. –

+0

실제로 달성하려는 시험은 무엇입니까? 나는 그것이'bank_account.create_bank_account; expect (bank_account.bank_name) .to eq ("Big Money")'? 다시 한 번 구체적인 답변을 제공하기 위해 더 많은 정보가 필요합니다. 그러나 테스트해야하는'BankAccount # create_bank_account' 메소드가 강하게 의심됩니다. –