2015-04-21 38 views
0

中指定我在Rhino模拟的Do方法上遇到异常。InvalidOperationException:代理的返回值应该可以从

System.InvalidOperationException:委托返回值应该是 分配从MediaPlayerImpl.ScreenControl.ScreenCommunicatorState

我不是很清楚如何解决它。以下是我的代码。它相当简单易懂。

var mockCommunicator = Rhino.Mocks.MockRepository.GenerateStrictMock<IScreenCommunicator>(); 

ManualResetEvent screenTurnedOff = new ManualResetEvent(false); 

mockCommunicator.Expect(c => c.TurnScreenOff(default(ScreenCommunicatorState))).IgnoreArguments() 
           .Do(new Action(() => screenTurnedOff.Set())); 


    public override ScreenCommunicatorState TurnScreenOn(ScreenCommunicatorState state) 
    { 
     state = state ?? new ScreenCommunicatorState { isScreenOn = false }; 

     if (state.isScreenOn) 
     { 
      // Try and Get the screen power state 

      // .... 
      Task<byte[]> requestTask = SendRequest(CommandSequences.GetPowerStatus); 
      var isPowerOn = InterpretScreenPowerStatusMessage(requestTask); 
      if (isPowerOn.Value) 
      { 
       //  Do nothing 
      } 
      else if (!isPowerOn.Value) 
      { 
       SendCommandSequence(CommandSequences.PowerOn); 
      } 
      else if (isPowerOn == null) 
      { 
       SendCommandSequence(CommandSequences.PowerOn); 
      } 




      // NO 


     } 

     state.isScreenOn = true; 

     Task<bool?> screenTurnedOnTask = IsScreenTurnedOn(); 

     Func<Task<bool?>, Task> doSomeWork = TurnScreenOnAndRectifyScreenInputSource; 



     Task<Task> turnScreenOnIfNecessaryTask = screenTurnedOnTask.ContinueWith(doSomeWork, TaskContinuationOptions.NotOnFaulted); 

     Task unwrapped = turnScreenOnIfNecessaryTask.Unwrap(); 
     try 
     { 
      unwrapped.Wait(); // This will thrown an exception if it's faulted, which is what we want 
     } 
     catch (AggregateException aggregateException) 
     { 
      if (aggregateException.InnerExceptions.Count() == 1) 
      { 
       throw aggregateException.InnerExceptions[0]; 
      } 
      else 
      { 
       throw; 
      } 
     } 
     return state; 
    } 
+0

你可以发布整个错误,标题截断。 –

+0

您的期望似乎没有提供.Return(...)电话。 IScreenCommunicator.turnScreenOff方法声明是什么样的? –

回答

0

我不得不使用和Func委托为了解决这个问题。

.Do(new Func<ScreenCommunicatorState,ScreenCommunicatorState>((id) => { 
           screenTurnedOff.Set(); 
           return new ScreenCommunicatorState(); 
          })) 
          .Return(new ScreenCommunicatorState());