Saya memiliki tes seperti ini:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock<IPathData>();
var pageModel = new Mock<IPageModel>();
var repository = new Mock<IPageRepository>();
var mapper = new Mock<IControllerMapper>();
var container = new Mock<IContainer>();
container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);
pathData.Setup(x => x.Action).Returns("myaction");
pathData.Setup(x => x.Controller).Returns("page");
var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);
// Act
var data = resolver.ResolvePath(path);
// Assert
Assert.NotNull(data);
Assert.AreEqual("myaction", data.Action);
Assert.AreEqual("page", data.Controller);
}
GetPageByUrl
berjalan dua kali di saya DashboardPathResolver
, bagaimana saya bisa memberitahu Moq untuk kembali null
pertama kali dan pageModel.Object
yang kedua?
c#
unit-testing
nunit
moq
marcus
sumber
sumber
SetupSequence()
tidak berhasilCallback()
. Jika itu benar, seseorang dapat memverifikasi panggilan ke metode yang diolok-olok dengan cara "mesin negara".SetupSequence
hanya berfungsi untuk dua panggilan tapi apa yang bisa saya lakukan jika perlu lebih dari dua panggilan?SetupSequence
dapat digunakan untuk jumlah panggilan yang sewenang-wenang. Contoh pertama yang saya berikan mengembalikan urutan 5 panggilan.Jawaban yang ada bagus, tapi saya pikir saya akan menggunakan alternatif saya yang hanya menggunakan
System.Collections.Generic.Queue
dan tidak memerlukan pengetahuan khusus tentang kerangka mengejek - karena saya tidak punya ketika saya menulisnya! :)Kemudian...
sumber
Exception
karena Anda tidakEnqueue
bisa. TetapiSetupSequence
akan berfungsi (lihat jawaban dari @stackunderflow misalnya).Dequeue()
bukan hanyaDequeue
, Anda akan benar.Menambahkan panggilan balik tidak berfungsi untuk saya, saya menggunakan pendekatan ini sebagai gantinya http://haacked.com/archive/2009/09/29/moq- berikutnyaences.aspx dan saya berakhir dengan tes seperti ini:
sumber
Anda dapat menggunakan panggilan balik saat mengatur objek tiruan Anda. Lihatlah contoh dari Moq Wiki ( http://code.google.com/p/moq/wiki/QuickStart ).
Pengaturan Anda mungkin terlihat seperti ini:
sumber
Setup()
panggilan lagi, danReturn()
nilai yang berbeda.Sekarang Anda dapat menggunakan SetupSequence. Lihat posting ini: http://codecontracts.info/2011/07/28/moq-setup berikutnyaence-is-great-for-mocking/
sumber
Mencapai di sini untuk jenis masalah yang sama dengan persyaratan yang sedikit berbeda.
Saya perlu mendapatkan nilai kembali yang berbeda dari mock berdasarkan nilai input yang berbeda dan menemukan solusi yang IMO lebih mudah dibaca karena menggunakan sintaks deklaratif Moq (linq to Mocks).
sumber
da.GetFromDb(0) == new Account { ..None.. && da.GetFromDb(1) == new Account { InActive } && ...
, tanpaIt.Is
-lambda diperlukan sama sekali.The jawaban yang diterima , serta jawaban SetupSequence , menangani kembali konstanta.
Returns()
memiliki beberapa kelebihan yang berguna di mana Anda dapat mengembalikan nilai berdasarkan parameter yang dikirim ke metode yang diejek. Berdasarkan solusi yang diberikan dalam jawaban yang diterima, berikut adalah metode ekstensi lain untuk kelebihan itu.Sayangnya, menggunakan metode ini mengharuskan Anda untuk menentukan beberapa parameter templat, tetapi hasilnya masih cukup mudah dibaca.
Buat overloads untuk metode ekstensi dengan beberapa parameter (
T2
,T3
, dll) jika diperlukan.sumber