Saya memiliki beberapa kode yang memunculkan PropertyChanged
peristiwa dan saya ingin dapat menguji unit bahwa peristiwa tersebut dimunculkan dengan benar.
Kode yang meningkatkan acara adalah seperti
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
Saya mendapatkan tes hijau yang bagus dari kode berikut dalam unit test saya, yang menggunakan delegasi:
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
string actual = null;
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
myClass.MyProperty = "testing";
Assert.IsNotNull(actual);
Assert.AreEqual("MyProperty", actual);
}
Namun, jika saya kemudian mencoba dan rangkaian pengaturan properti bersama seperti:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Tes saya untuk acara tersebut gagal - peristiwa yang ditangkapnya adalah acara untuk MyOtherProperty.
Saya cukup yakin acara ini menyala, UI saya bereaksi seperti itu, tetapi delegasi saya hanya menangkap acara terakhir yang akan dipecat.
Jadi saya bertanya-tanya:
1. Apakah metode pengujian peristiwa saya benar?
2. Apakah metode saya meningkatkan acara berantai benar?
sumber
Jika Anda melakukan TDD maka pengujian peristiwa dapat mulai menghasilkan banyak kode berulang. Saya menulis monitor acara yang memungkinkan pendekatan yang jauh lebih bersih untuk penulisan tes unit untuk situasi ini.
Silakan lihat jawaban saya untuk yang berikut untuk lebih jelasnya.
Unit menguji bahwa suatu peristiwa dimunculkan dalam C #, menggunakan refleksi
sumber
Ini sangat tua dan mungkin tidak akan dibaca tetapi dengan beberapa fitur .net baru yang keren Saya telah membuat kelas INPC Tracer yang memungkinkan:
Lihat inti: https://gist.github.com/Seikilos/6224204
sumber
Di bawah ini adalah kode Andrew yang sedikit berubah yang alih-alih hanya mencatat urutan peristiwa yang dibangkitkan, melainkan menghitung berapa kali peristiwa tertentu dipanggil. Meskipun didasarkan pada kodenya saya merasa lebih berguna dalam pengujian saya.
sumber
Berdasarkan artikel ini, saya telah membuat pembantu pernyataan sederhana ini:
Dengan metode penolong ini, tes menjadi sangat sederhana.
sumber
Jangan menulis tes untuk setiap anggota - ini banyak pekerjaan
(mungkin solusi ini tidak sempurna untuk setiap situasi - tetapi ini menunjukkan cara yang mungkin. Anda mungkin perlu menyesuaikannya untuk kasus penggunaan Anda)
Dimungkinkan untuk menggunakan refleksi di perpustakaan untuk menguji apakah anggota Anda semua merespons acara Anda yang diubah properti dengan benar:
Kode berikut dapat digunakan sebagai perpustakaan dan menunjukkan cara menguji kelas generik berikut
Tes kelas Anda sekarang dapat ditulis sebagai. (mungkin Anda ingin membagi tes menjadi "acara di sana" dan "acara yang diangkat dengan nama yang benar" - Anda dapat melakukannya sendiri)
Kelas
sumber
Saya telah membuat ekstensi di sini:
Ada penggunaannya:
sumber