2014-05-23 3 views
4

그래픽 메서드 CancelChanges()가 ViewModel에 의해 사용되고 호출되었습니다. 이 메서드를 테스트하고 싶지만 내부에 Task가 있습니다. 작업을 사용하여 UI를 고정하지 않습니다. 테스트 방법은 결과를 확인하기 위해이 태스크의 결과를 기다려야합니다.단위 작업 내에서 작업으로 void 메서드를 테스트하십시오.

코드는 다음과 같습니다

public override void CancelChanges() 
{ 
     Task.Run(
      async() => 
       { 
        this.SelectedWorkflow = null; 
        AsyncResult<IncidentTypeModel> asyncResult = await this.Dataprovider.GetIncidentTypeByIdAsync(this.Incident.Id); 

        Utils.GetDispatcher().Invoke(
         () => 
          { 
           if (asyncResult.IsError) 
           { 
            WorkflowMessageBox.ShowException(
             MessageHelper.ManageException(asyncResult.Exception)); 
           } 
           else 
           { 
            this.Incident = asyncResult.Result; 
            this.Refreshdesigner(); 
            this.HaveChanges = false; 
           } 
          }); 
       }); 
} 

그리고 내 시험 방법 :

우리가 작업의 결과를 기다리고 내 검사를 할 수있는 방법
/// <summary> 
///  A test for CancelChanges 
/// </summary> 
[TestMethod] 
[TestCategory("ConfigTool")] 
public void CancelChangesTest() 
{ 
    string storexaml = this._target.Incident.WorkflowXamlString; 
    this._target.Incident.WorkflowXamlString = "dsdfsdgfdsgdfgfd"; 

    this._target.CancelChanges(); 

    Assert.IsTrue(storexaml == this._target.Incident.WorkflowXamlString); 
    Assert.IsFalse(this._target.HaveChanges); 
} 

?

감사합니다.

+5

는 반환 형식'Task'을 만들 수 있습니까? 또한,'GetIncidentTypeByIdAsync'가 비동기 적이기 때문에 (그리고 잘하면 non-blocking) 당신이'Task.Run'을 필요로하지 않는 것처럼 보입니다. – usr

답변

5

CancelChanges 메서드를 Task으로 반환 한 다음 테스트 메서드에서이 값을 기다리거나 기다려야합니다. 일부이 같은

public override Task CancelChanges() 
{ 
    return Task.Factory.StartNew(() => 
     { 
      // Do stuff... 
     }); 
} 

통지 Task.Run에서 Task.Factory.StartNew에 대한 변경. 이 경우 작업을 시작하는 데 더 좋은 방법입니다. 그런 다음 시험 방법

[TestMethod] 
[TestCategory("ConfigTool")] 
public void CancelChangesTest() 
{ 
    string storexaml = this._target.Incident.WorkflowXamlString; 
    this._target.Incident.WorkflowXamlString = "dsdfsdgfdsgdfgfd"; 
    this._target.CancelChanges().ContinueWith(ant => 
     { 
      Assert.IsTrue(storexaml == this._target.Incident.WorkflowXamlString); 
      Assert.IsFalse(this._target.HaveChanges); 
     }); 
} 

에 당신은 또한 async으로 시험 방법을 표시 할 수 있으며, 같은 일을하는 시험 방법에 await를 사용합니다.

이 정보가 도움이되기를 바랍니다.

+0

동 기적으로 처리하려면'this._target.CancelChanges(). Wait()'도 사용할 수 있습니다. – Kenneth

+1

도움 주셔서 감사합니다. 우리는 지금이 버전을 사용합니다. 작동 중이고 UI가 동결되지 않았습니다. – Adrien

+0

기꺼이 도와 드리겠습니다 ... – MoonKnight

1

리팩토링을 한 걸음 더 앞당길 것이고 가능한 경우 Task.Run을 사용하지 마십시오. 당신이 모두 기다리고 다음 UI 스레드에서 작업을 호출하기 때문에, 나는 할 것이다 다음

public override Task CancelChanges() 
{ 
    this.SelectedWorkflow = null; 
    AsyncResult<IncidentTypeModel> asyncResult =  await this.Dataprovider.GetIncidentTypeByIdAsync(this.Incident.Id); 
    if (asyncResult.IsError) 
    {   WorkflowMessageBox.ShowException(MessageHelper.ManageException(asyncResult.Exception)); 
    }   
    else 
    { 
     this.Incident = asyncResult.Result; 
     this.Refreshdesigner(); 
     this.HaveChanges = false; 
    } 
    }); 
}); 
} 

및 시험 방법 :

[TestMethod] 
[TestCategory("ConfigTool")] 
public async Task CancelChangesTest() 
{ 
    string storexaml = this._target.Incident.WorkflowXamlString; 
    this._target.Incident.WorkflowXamlString = "dsdfsdgfdsgdfgfd"; 

    var cancelChanges = await this._target.CancelChanges(); 

    Assert.IsTrue(storexaml == this._target.Incident.WorkflowXamlString); 
    Assert.IsFalse(this._target.HaveChanges); 
} 
관련 문제