2016-12-20 23 views
-4

次のインターフェイスとクラスを持っているので、テストをnunitしようとしていますが、テストが失敗し、その理由がわかりません。C#アプリケーションの非同期テストでNUnitテストが予期せず失敗する

[Test] 
public async void Test1([Values(200)]int personId) 
{ 
const double expectedResult = 20;  
var serviceMock = new Mock<IAccountService>(); 

var taskCompletion = new TaskCompletionSource<double>(); 
taskCompletion.SetResult(10); 
serviceMock.Setup(x => x.GetAccDetails(It.Is<int>(id => id == personId))) 
     .Returns(taskCompletion.Task); 

var person = new Person(personId, serviceMock.Object); 

await person.UpdateBanckingAcc(); 

double res = person.Amount; 
Assert.AreEqual(expectedResult, res); 
} 

このテストで何が問題になっています:

public interface IService 
{ 
Task<double> GetAccDetails(int personId); 
} 

public class Person 
{ 
private int _personId; 
private IService _service; 

public Person(int personId, IService service) 
{ 
    _personId= personId; 
    _service = service; 
} 

public double Amount {get; set;} 

public async Task UpdateBanckingAcc() 
{ 
    Amount = await _service.GetAccDetails(_personId); 
} 
} 

そして、これは、ユニットテストはありますか?

答えて

3

アサートメッセージは、自身のために言う:

期待

:20.0d

しかしだった:10.0d

あなたの期待される結果は、の値を持つ20しかし、あなた誤っスタブGetAccDetails()であります10.次の行を変更すると、テストは合格となります。

taskCompletion.SetResult(20); 
+0

「taskCompletion.SetResult(expectedResult);」がおそらく良いでしょう。 – VMAtm

+0

申し訳ありませんが、これは問題ではありません。番号は正しいです。 –

+0

私はあなたのテストを修正した番号で実行し、合格しました。テストが失敗した場合、どのようなエラーが発生しますか? – CodeFuller

0

CodeFullerですでに述べたように、期待値とは異なる値をタスクに提供しています。

モックを設定するときにはReturnsAsyncメソッドを使用し、非同期メソッドを作成するときはasync voidを使用しないようにしてください(ルールの例外でない限り、非同期メソッドを作成することは避けてください)。

[Test] 
public async Task Test1([Values(200)]int personId) { 
    //Arrange 
    double expectedResult = 20.0; 

    var serviceMock = new Mock<IAccountService>(); 

    serviceMock 
     .Setup(x => x.GetAccDetails(It.Is<int>(id => id == personId))) 
     .ReturnsAsync(expectedResult); // User ReturnsAsync here 

    var person = new Person(personId, serviceMock.Object); 

    //Act 
    await person.UpdateBanckingAcc(); 

    var actualResult = person.Amount; 

    //Assert 
    Assert.AreEqual(expectedResult, actualResult); 
} 
+0

ありがとう、私は問題を発見した:私は方法の署名にkeyworkタスクを追加するのを忘れてしまった –

関連する問題