       ended = false
       expectedResult = block.call this
       runs ->
-        promise.call(this)
+        (promise?.call(this) or @promise or @subject)
         .then (result) ->
           expect(result).toEqual(expectedResult)
           ended = true

    it "the returned promise should fail with #{msg}", ->
      ended = false
      runs ->
        promise.call(this)
        .then =>
          block.apply(this, arguments)
          ended = true

    it 'the returned promise should be fulfilled', ->
      ended = false
      runs ->
        (promise?.call(this) or @promise or @subject)
        .then ->
          expect(true).toBeTruthy()
          ended = true
