Xunit memiliki fitur yang bagus : Anda dapat membuat satu pengujian dengan Theory
atribut dan memasukkan data ke dalam InlineData
atribut, dan xUnit akan menghasilkan banyak pengujian, dan menguji semuanya.
Saya ingin memiliki sesuatu seperti ini, tetapi parameter untuk metode saya tidak 'data sederhana' (seperti string
, int
, double
), tapi daftar kelas saya:
public static void WriteReportsToMemoryStream(
IEnumerable<MyCustomClass> listReport,
MemoryStream ms,
StreamWriter writer) { ... }
c#
unit-testing
xunit
xunit.net
zchpit
sumber
sumber
Jawaban:
Ada banyak
xxxxData
atribut di XUnit. Lihat misalnyaPropertyData
atribut.Anda dapat mengimplementasikan properti yang mengembalikan
IEnumerable<object[]>
. Masingobject[]
- masing yang dihasilkan metode ini akan "dibongkar" sebagai parameter untuk satu panggilan ke[Theory]
metode Anda .Opsi lainnya adalah
ClassData
, yang berfungsi sama, tetapi memungkinkan untuk dengan mudah berbagi 'generator' antara pengujian di kelas / ruang nama yang berbeda, dan juga memisahkan 'generator data' dari metode pengujian yang sebenarnya.Lihat contoh berikut dari sini :
Contoh PropertyData
Contoh ClassData
sumber
static
. Itulah mengapa saya tidak mau. ClassData adalah saat Anda ingin melepaskan diri dari statika. Dengan demikian, Anda dapat menggunakan kembali (yaitu membuat sarang) generator lebih mudah.[MemberData("{static member}", MemberType = typeof(MyClass))]
untuk menggantiClassData
atribut.nameof
kata kunci daripada hardcoding nama properti (rusak dengan mudah tapi diam-diam).Untuk memperbarui jawaban @ Quetzalcoatl: Atribut
[PropertyData]
telah digantikan[MemberData]
yang mengambil nama string dari setiap metode statis, bidang, atau properti yang mengembalikanIEnumerable<object[]>
. (Saya merasa sangat senang memiliki metode iterator yang benar-benar dapat menghitung kasus uji satu per satu, menghasilkannya saat dihitung.)Setiap elemen dalam urutan yang dikembalikan oleh enumerator adalah an
object[]
dan setiap array harus memiliki panjang yang sama dan panjang tersebut harus merupakan jumlah argumen untuk kasus pengujian Anda (dianotasi dengan atribut[MemberData]
dan setiap elemen harus memiliki jenis yang sama dengan parameter metode yang sesuai (Atau mungkin bisa jadi tipe convertible, saya tidak tahu.)(Lihat catatan rilis untuk xUnit.net Maret 2014 dan patch aktual dengan kode contoh .)
sumber
Membuat array objek anonim bukanlah cara termudah untuk membangun data jadi saya menggunakan pola ini dalam proyek saya
Pertama, tentukan beberapa kelas bersama yang dapat digunakan kembali
Sekarang pengujian individu dan data anggota Anda lebih mudah ditulis dan lebih bersih ...
Description
Properti string akan memberatkan diri Anda sendiri saat salah satu dari banyak kasus pengujian Anda gagalsumber
Misalkan kita memiliki kelas Mobil kompleks yang memiliki kelas Pabrikan:
Kami akan mengisi dan lulus kelas Mobil ke tes Teori.
Jadi buat kelas 'CarClassData' yang mengembalikan instance kelas Car seperti di bawah ini:
Saatnya membuat metode pengujian (CarTest) dan menentukan mobil sebagai parameter:
Semoga berhasil
sumber
Anda bisa mencoba cara ini:
Buat kelas lain untuk menyimpan data pengujian:
sumber
Untuk kebutuhan saya, saya hanya ingin menjalankan serangkaian 'pengguna uji' melalui beberapa pengujian - tetapi [ClassData] dll. Tampaknya berlebihan untuk apa yang saya butuhkan (karena daftar item dilokalkan ke setiap pengujian).
Jadi saya melakukan yang berikut, dengan array di dalam tes - diindeks dari luar:
Ini mencapai tujuan saya, sekaligus menjaga tujuan pengujian tetap jelas. Anda hanya perlu menjaga indeks tetap sinkron, tetapi itu saja.
Kelihatannya bagus di hasil, ini dapat diciutkan dan Anda dapat menjalankan kembali contoh tertentu jika Anda mendapatkan kesalahan:
sumber
MemberData
tampaknya adalah Anda tidak dapat melihat atau menjalankan tes dengan input tes tertentu. Menyebalkan sekali.MemberData
jika Anda menggunakanTheoryData
dan secara opsionalIXunitSerializable
. Info lebih lanjut dan contoh di sini ... github.com/xunit/xunit/issues/429#issuecomment-108187109Beginilah cara saya memecahkan masalah Anda, saya memiliki skenario yang sama. Jadi sejalan dengan objek khusus dan jumlah objek yang berbeda pada setiap proses.
Jadi ini unit test saya, perhatikan parameter params . Ini memungkinkan untuk mengirim sejumlah objek yang berbeda. Dan sekarang kelas DeviceTelemetryTestData saya :
Semoga membantu!
sumber
Saya kira Anda salah di sini. Apa
Theory
sebenarnya arti atribut xUnit : Anda ingin menguji fungsi ini dengan mengirimkan nilai khusus / acak sebagai parameter yang diterima oleh fungsi yang sedang diuji ini. Itu berarti bahwa apa yang Anda definisikan sebagai atribut berikutnya, seperti:InlineData
,PropertyData
,ClassData
, dll .. akan menjadi sumber bagi mereka parameter. Itu berarti Anda harus membuat objek sumber untuk menyediakan parameter tersebut. Dalam kasus Anda, saya kira Anda harus menggunakanClassData
objek sebagai sumber. Juga - harap dicatat bahwaClassData
mewarisi dari:IEnumerable<>
- itu berarti setiap kali kumpulan parameter yang dihasilkan akan digunakan sebagai parameter masuk untuk fungsi yang sedang diuji hinggaIEnumerable<>
menghasilkan nilai.Contoh di sini: Tom DuPont .NET
Contoh mungkin salah - Saya tidak menggunakan xUnit untuk waktu yang lama
sumber