Saya punya antarmuka yang menyatakan
Task DoSomethingAsync();
Saya menggunakan MoqFramework untuk pengujian saya:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Kemudian dalam pengujian saya, saya menjalankan kode yang memanggil await DoSomethingAsync()
. Dan tes itu gagal pada garis itu. Apa yang saya lakukan salah?
c#
unit-testing
task-parallel-library
moq
Waldemar
sumber
sumber
Jawaban:
Metode Anda tidak memiliki panggilan balik sehingga tidak ada alasan untuk menggunakannya
.CallBack()
. Anda cukup mengembalikan Tugas dengan menggunakan nilai-nilai yang diinginkan menggunakan.Returns()
dan Task.From , misalnya:Pembaruan 2014-06-22
Moq 4.2 memiliki dua metode ekstensi baru untuk membantu ini
Perbarui 2016-05-05
Seperti Seth Bunga menyebutkan dalam jawaban lain ,
ReturnsAsync
hanya tersedia untuk metode yang mengembalikan aTask<T>
. Untuk metode yang hanya mengembalikan Tugas,dapat digunakan.
Seperti yang ditunjukkan dalam jawaban ini , dalam. NET 4.6 ini disederhanakan menjadi
.Returns(Task.CompletedTask);
, misalnya:sumber
.Returns(Task.FromResult(default(object))
berfungsi dengan baik ketika jenis kembali tidak berlaku..Returns(Task.FromResult(null as MyType))
berfungsi dengan baik ketika tipe pengembalian yang diharapkan adalah nol.default(object)
tidak lagi diperlukan.null as MyType
sama dengandefault(MyType)
asalkanMyType
merupakan tipe referensi.Masalah serupa
Saya memiliki antarmuka yang mirip:
Gejala
Uji unit saya gagal ketika layanan saya sedang menguji
awaited
panggilan keDoSomething
.Memperbaiki
Berbeda dengan jawaban yang diterima, Anda tidak dapat memanggil
.ReturnsAsync()
pada AndaSetup()
dari metode ini dalam skenario ini, karena metode mengembalikan non-generikTask
, bukanTask<T>
.Namun, Anda masih dapat menggunakan
.Returns(Task.FromResult(default(object)))
pada pengaturan, memungkinkan tes untuk lulus.sumber
Anda hanya perlu menambahkan
.Returns(Task.FromResult(0));
setelah Callback.Contoh:
sumber
Sekarang Anda juga dapat menggunakan paket Talentsoft.Moq.SetupAsync https://github.com/TalentSoft/Moq.SetupAsync
Yang berdasarkan jawaban yang ditemukan di sini dan ide-ide yang diajukan ke Moq tetapi masih belum diimplementasikan di sini: https://github.com/moq/moq4/issues/384 , sangat menyederhanakan pengaturan metode async
Beberapa contoh ditemukan dalam respons sebelumnya yang dilakukan dengan ekstensi SetupAsync:
sumber