Saya memiliki objek yang saya coba tiru menggunakan moq. Konstruktor objek memiliki parameter yang diperlukan:
public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider,
ICrmProvider crmProvider,
ICacheProvider cacheProvider) { ... }
}
Sekarang saya mencoba membuat tiruan untuk objek ini menggunakan sintaks "setup" moq v3 atau v4 "Mock.Of" tetapi tidak dapat menemukan jawabannya ... semua yang saya coba tidak memvalidasi. Inilah yang saya miliki sejauh ini, tetapi baris terakhir memberi saya objek nyata, bukan tiruan. Alasan saya melakukan ini adalah karena saya memiliki metode di CustomerSyncEngine yang ingin saya verifikasi dipanggil ...
// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();
// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);
Jawaban:
Baris terakhir memberi Anda contoh nyata karena Anda menggunakan kata kunci baru, tidak mengejek CustomerSyncEngine.
Kamu harus menggunakan
Mock.Of<CustomerSyncEngine>()
Satu-satunya masalah dengan jenis Beton Mocking adalah bahwa Moq akan memerlukan konstruktor default publik (tanpa parameter) ATAU Anda perlu membuat Moq dengan spesifikasi arg konstruktor. http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html
Hal terbaik untuk dilakukan adalah mengklik kanan pada kelas Anda dan memilih antarmuka Ekstrak.
sumber
CustomerSyncEngine
yang hanya digunakanICrmProvider
dengan implementasi tiruan tradisional harus disediakan untuk ketiga antarmuka sedangkan wadah penguncian otomatis akan memungkinkan Anda untuk hanya menyediakan satu.Ubah baris terakhir menjadi
dan itu harus berhasil
sumber
new Mock<CustomerSyncEngine>(new object[]{mockLogger, mockCrm, mockCache}).Object;