Sebagai pendamping seri blog saya di .NET Mocking Frameworks dan cara kerjanya, repositori ini mencoba untuk mengimplementasikan tes unit yang sama dengan ejek menggunakan masing -masing kerangka kerja mengejek utama yang tersedia untuk .net.
Proyek ini dimaksudkan untuk menjadi referensi bagi siapa pun yang ingin membandingkan kerangka kerja mengejek .NET atau melihat contoh sintaks untuk kerangka kerja yang diberikan. Ini tidak dimaksudkan untuk menjadi referensi yang lengkap, bukan bukan gauranteed untuk bebas bug (tapi tolong beri tahu saya jika Anda menemukan masalah apa pun).
Untuk menulis tes, kami membutuhkan beberapa kode yang membutuhkan pengujian. Jadi, saya telah membuat LunchNotifier , kelas dunia yang sedikit lebih-lebih dari-hello terhadap tes unit (dengan tiruan) dapat ditulis.
Salah satu manfaat yang diberikan untuk menumpuk emplpoyees yang bekerja di kantor New York adalah makan siang gratis dari koki in-house. Setiap hari, ketika koki selesai menyiapkan makanan, pemberitahuan diberikan kepada karyawan di kantor untuk memberi tahu mereka bahwa makanan tersedia.
Dalam proyek CodeBeingTested , kelas LunchNotifier adalah target utama kami.
Kelas ini mengambil lima tanggungan eksternal yang perlu diejek untuk melakukan tes kami:
INotificationService (disuntikkan melalui konstruktor)ILogger (disuntikkan melalui konstruktor)IEmployeeService (disuntikkan melalui konstruktor)IEmployee ) yang berbasis di kantor New YorkIEmployee (dikembalikan dari IEmployeeService )System.DateTime Logika utamanya adalah di LunchNotifier.SendLunchtimeNotifications() . Metode ini mencakup panggilan inline ke System.DateTime.Now , yang tidak dapat diejek oleh kerangka kerja yang dikontrol seperti MOQ atau Rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Implementasi alternatif disediakan untuk digunakan oleh bingkai yang dikontrol dalam LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() , di mana panggilan ke DateTime.Now telah diekstraksi ke dalam metode sendiri, yang dapat diganti dalam tiruan:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Masing -masing proyek yang tersisa berupaya menerapkan serangkaian tes unit serupa terhadap LunchNotifier yang menggunakan kerangka kerja mengejek yang berbeda.
Semua tes ditulis menggunakan Nunit v3.10 melalui paket Nuget.
Dalam beberapa kasus, ada banyak cara untuk mendekati tes menggunakan kerangka kerja mengejek, jadi saya telah memberikan banyak varian tes untuk menampilkan pendekatan yang berbeda.
Tes ini menciptakan karyawan tiruan "Bob" yang lebih suka pemberitahuan email dan menggunakan tiruan untuk memastikan logika LunchNotifier akan mengiriminya email ketika makan siang siap.
Tes ini menciptakan dua karyawan tiruan, "Bob" dan "Martha" dan memastikan bahwa jika mengirim pemberitahuan kepada salah satu dari mereka mengakibatkan kesalahan dicatat dan tidak mencegah karyawan yang tersisa untuk diberitahu.
Tes ini menggunakan sintaks TestCase Nunit untuk menjalankan dua kasus uji, satu untuk sebelum jam 1 siang dan satu untuk setelah jam 1 siang, untuk memastikan template pemberitahuan yang tepat digunakan berdasarkan waktu hari.
Untuk kerangka kerja yang tidak dibatasi, DateTime.Now dapat secara langsung dikendalikan untuk mengembalikan waktu input tes, namun, kerangka kerja yang dibatasi tidak dapat, sehingga mereka harus mengekstrak panggilan ke DateTime.Now Sekarang ke dalam metode sperate dan memodifikasi perilaku metode baru itu sebagai gantinya. Dengan demikian kebutuhan akan varian SendLunchtimeNotifications_DateTimeSeam .
Jenis: Dibatasi
Proyek: https://github.com/moq/moq4/wiki/quickstart
Nuget: https://www.nuget.org/packages/moq/
Jenis: Dibatasi
Proyek: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
Peringatan: Rhinomocks secara efektif merupakan proyek yang mati dan kemungkinan tidak akan memberikan dukungan untuk perubahan .NET di masa depan, seperti .NET Core. Saya tidak menyarankan Anda mulai menggunakan kerangka kerja ini jika Anda belum menggunakannya.
Untuk menjalankan tes ini, Anda harus menginstal VS2017 Enterprise (atau equiv).
Jenis: Dibatasi
Proyek: http://nsubstitute.github.io/
Nuget: https://www.nuget.org/packages/nsubstitute
Jenis: Tidak dibatasi
Microsoft Fakes hadir sebagai bagian dari Visual Studio 2017 Enterprise atau Visual Studio 2015 Ultimate dan tidak tersedia sebagai komponen yang sperate.
Fake tidak secara native mendukung validasi gaya AssertWasCalled , jadi saya menggunakan paket nuget tambahan (yang telah saya kontribusikan) untuk menyediakan fitur itu: fakes.contrib / nuget
Jenis: Tidak dibatasi
Info Produk: https://www.typemock.com/isolator
Produk ini membutuhkan lisensi berbayar (ada uji coba 15 hari gratis yang tersedia) untuk melakukan mengejek yang tidak dibatasi. Typemock cukup bagus untuk memberi saya lisensi komunitas gratis sehingga saya dapat mengerjakan proyek seperti ini.