2012-07-03 81 views
1

我使用Mockolate和Flex單元4爲AS3中的測試編寫模擬。我想用相同的參數多次調用同一個模擬方法 次,每次返回不同的結果。一個基本的例子是:Mockolate - 使用相同的參數在模擬上調用相同的方法,但返回不同的結果

  [Rule] 
      public var mocks:MockolateRule = new MockolateRule(); 

      [Mock(type="strict")] 
      public var list:IList; 

      [Test] 
      public function test():void{ 

        var seq:Sequence = sequence(); 
        expecting(function():void { 
          expect(list.getItemAt(0)).returns("Item1").thrice().inSequence(seq); 
          expect(list.getItemAt(0)).returns("Item2").inSequence(seq); 
          expect(list.getItemAt(0)).returns("Item3").inSequence(seq); 
        }); 

        trace(list.getItemAt(0)); 
        trace(list.getItemAt(0)); 
        trace(list.getItemAt(0)); 

        verify(list); 
      } 

這導致:

Item1 
Item2 
Item2 

而且和錯誤:

1 unmet Exception 

我要的是

Item1 
Item2 
Item2 

,並沒有異常,即測試通過。

我已經嘗試了一些替代品,如:

    expecting(function():void { 
          expect(list.getItemAt(0)).returns("Item1").inSequence(seq); 
          expect(list.getItemAt(0)).returns("Item2").inSequence(seq); 
          expect(list.getItemAt(0)).returns("Item3").inSequence(seq); 
        }); 

和其他無濟於事。當然,我在這裏錯過了一些簡單的東西。這個 看起來應該很容易。

謝謝你們,

Theo。

+0

我不確定:如果調用'list.getItemAt(0)'第一次返回「item1」,第二次返回「item2」並且第三次返回「item3」,你是否要斷言? – Kasztan

回答

3

這讓我失望了,直到我發現它確實非常簡單:只需使用所有預期的返回值作爲第一條returns()語句的參數即可。

expect(list.getItemAt(0)).returns("Item1", "Item2", "Item3", "Item4").inSequence(seq); 

該模擬將返回每個後續調用的這些參數的最後一個。

+0

非常感謝。完美解決方案 – user1498817

相關問題