2017-10-08 4 views
0

let 값을 사양에 덮어 쓸 수 있습니까? 각 테스트마다 다음과 같이 주제를 설정하고 매개 변수를 수정할 수 있기를 원했습니다.덮어 쓰기를 사용하여 매개 변수를 변경하는 방법

subject { 
    MyClass.new params 
    } 

    let(:params) { {} } 

    describe '#initialize' do 
    it 'should set new params' do 
     params = {a: 1} 
     expect{ subject }.to do_something 
    end 
    it 'should raise with string' do 
     params = 'string' 
     expect{ subject }.to raise_error 
    end 
    end 

또는이 접근 방법은 무엇입니까? 전체 클래스 이름으로 expect{}을 작성해야합니까?

subject { -> { MyClass.new(params) } } # Note: subject is a lambda 

describe '#initialize' do 
    context 'with blank params' do 
    let(:params) { {} } 
    it { is_expected.to do_something } 
    end 

    context 'with string params' do 
    let(:params) { 'string' } 
    it { is_expected.to raise_error } 
    end 
end 

-하지만 최대 pleaner 이미 말했듯이 -이 간단한 예제에서 아마 subject을 건너 뛰고 직접 MyClass.new ... 호출을 사용하는 것이 더 읽기 쉽고 유지 보수가 될 것이다 :

+0

나는 단지 각 테스트 케이스에 MyClass.new를 넣거나 도우미 함수로 옮길 것이다. –

답변

1

나는 다음과 같은 사양을 다시 것 기대에

+0

OP는 RSpec의 블록 구문을 사용했습니다. IMO는 피사체가 람다 인 경우 한 줄짜리 구문으로 만 변환 할 수 있습니다. – spickermann

+0

'expect (subject) .to'는'expect {subject} .to'와 다르게 작동하기 때문에. 첫 번째 문자는'is {expected_to ...'로 변환되고, 두 번째 문자는 오지 않는다. 'expect (subject)'는 표현식의 반환 값을 지정합니다.'expect {subject}는 부작용입니다. [this GitHub issue] (https://github.com/rspec/rspec-expectations/issues/805)를 참조하십시오. – spickermann

+0

예, 당신은 옳았으며 귀하의 요지를 오해했습니다. https://github.com/rspec/rspec-expectations/issues/805. 이것은 is_expected.to 구문의 단점 인 것 같습니다. 나는 거의 그것을 사용하지 않는다. –

관련 문제