如何在下面的示例中調用Foo.bar
而不測試bar
方法的行爲(已在別處測試過)?是否可以使用MiniTest測試類方法(例如Foo.bar)?
# Code
class Alpha
def process
Foo.bar
end
end
以下規範是我到目前爲止的內容。不幸的是,由於Foo已經在我的項目的其他地方定義過了,所以這種方法會拋出一個「class already defined」警告。
# Spec
let(:alpha) { Alpha.new }
let(:klass) { MiniTest::Mock.new }
subject { alpha.process }
it "calls Foo.bar" do
klass.expect(:bar, '') # Define method call expectation
Foo = klass # Redefine Foo as a mock object
subject # Run method being tested
klass.verify # Confirm method was called
end
我不希望我的測試依賴於Foo
類,因爲這是一個外部的依賴,我不想要測試的Foo.bar
響應值,因爲這可能會隨意改變。
正確的,確實如此。如果我的「process」方法(按照上面的示例)應該執行@ foo_class.new.bar會怎麼樣?這應該是我的期望? fooClassMock.expect(:bar,'')很簡單,但另一個應該是fooClassMock.expect(:new,Foo)或其他東西?我無法嘲笑這樣的事情。任何提示? –
@ user1955626其實,我相信你應該期待':initialize',而不是期待':new'。 'initialize'的返回值應該是另一個'Mock',它需要':bar'並返回適當的值。但是,無論是期望':new'還是':initialize',關鍵是要返回另一個'Mock',它需要':bar'。 – Lee
關於':initialize'的介紹。關於返回的結果呢?它應該是'fooClassMock.expect(:initialize,the_other_mock.class)'或'fooClasssMock.expect(:initialize,the_other_mock.new)'或類似的東西?顯然已經編寫了像'the_other_moc = MiniTest :: Mock.new'這樣的新模擬和':bar'方法的特定期望。 –