Saya seorang pemula di XUnit dan Moq. Saya memiliki metode yang mengambil string sebagai argumen. Bagaimana menangani pengecualian menggunakan XUnit.
[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() {
//arrange
ProfileRepository profiles = new ProfileRepository();
//act
var result = profiles.GetSettingsForUserID("");
//assert
//The below statement is not working as expected.
Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));
}
Metode sedang diuji
public IEnumerable<Setting> GetSettingsForUserID(string userid)
{
if (string.IsNullOrWhiteSpace(userid)) throw new ArgumentException("User Id Cannot be null");
var s = profiles.Where(e => e.UserID == userid).SelectMany(e => e.Settings);
return s;
}
c#
unit-testing
xunit
wandermonk.dll
sumber
sumber
GetSettingsForUserID("")
sebelum mulai meneleponAssert.Throws
. TheAssert.Throws
panggilan tidak dapat membantu Anda di sana. Saya sarankan untuk tidak terlalu kaku tentang AAA ...Jawaban:
The Assert.Throws ekspresi akan menangkap pengecualian dan menegaskan jenis. Namun Anda memanggil metode yang sedang diuji di luar ekspresi assert dan karenanya gagal dalam kasus uji.
Jika bertekad mengikuti AAA, Anda dapat mengekstrak tindakan tersebut ke dalam variabelnya sendiri.
Perhatikan bagaimana pengecualian juga dapat digunakan untuk pernyataan detail mode
sumber
async Task act() => await service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
Task act() => service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
maka itu senang dengan itu dan berfungsi dengan baik.Jika Anda ingin bersikap kaku tentang AAA, Anda dapat menggunakan Record.Exception dari xUnit untuk menangkap Exception dalam tahap Act Anda.
Anda kemudian dapat membuat pernyataan berdasarkan pengecualian yang ditangkap di tahap Assert.
Contohnya dapat dilihat di tes xUnits .
Terserah Anda jalur mana yang ingin Anda ikuti, dan kedua jalur tersebut sepenuhnya didukung oleh apa yang disediakan xUnit.
sumber
var exception = Assert.Throws<InvalidOperationException>(testCode);
dan menegaskanexception.Message
? atau apakah itu hanya rasa lain untuk mencapai hal yang sama?Anda dapat mempertimbangkan sesuatu seperti ini jika Anda ingin tetap menggunakan AAA:
sumber