2014-03-05 48 views
1

我想檢查rspec測試(XOR)中兩個可能字符串中是否存在一個。rspec XOR應該包括

有得這樣的效果:

it "worked" do 
    ( 
    foo.bar.should include "A" AND foo.bar.should_not include "B" 
    || 
    foo.bar.should include "B" AND foo.bar.should_not include "A" 
) 
    # => if the above is false rspec should complain 
end 

這可能嗎?

回答

2

如何:

expect(foo.bar & ['A', 'B']).to have(1).item 

該溶液取陣列,與可能的值相交它,並確保只有一個元素(無論是'A''B')留。

@ steenslag的答案失敗,因爲當rspec的預期失敗,他們停止測試,所以「兩個falses不要讓一個真正的」 ...

如果你想使用舊should語法,它看起來像這樣:

(foo.bar & ['A', 'B']).should have(1).item 
+0

不知道期望()。甚至是有效的語法替換。 – cjhin

0

xor^

foo.bar.should(include "A")^foo.bar.should(include "B") 

當foo.bar包含「A」或「B」但不是兩者時,返回true。

ar = ["AC","BC", "AB", "CC"] 
ar.each{|str|p str.include?("A")^str.include?("B")} 
#true 
#true 
#false 
#false 
+0

^似乎沒有工作?我還以爲^是一個按位XOR? – cjhin

+0

(foo.bar.should [_not] include)語句/方法調用是否可能引發錯誤,而不是塊? – cjhin

+0

fixnum上的'^'是按位進行的,但它也在Trueclass和FalseClass上定義。 (已添加示例)。請注意,第一個版本支持一個錯誤,並在5分鐘內由我編輯。 – steenslag