وحيد القرن يسخر:كيف يمكنني الاستهزاء بالطريقة التي تحول مدخلاتها؟

StackOverflow https://stackoverflow.com/questions/59396

  •  09-06-2019
  •  | 
  •  

سؤال

لدي كائن الوصول إلى البيانات TransactionDao.عندما تتصل بـ TransactionDao.Save(transaction) أود أن يتم تعيين معاملة.IsSaved=علامة حقيقية (هذا تبسيط، الشيء الفعلي الذي أحاول القيام به ليس عاديًا تمامًا).لذا، عند الاستهزاء بـ TransactionDao الخاص بي باستخدام RhinoMocks، كيف يمكنني الإشارة إلى أنه يجب عليه تحويل مدخلاته؟

من الناحية المثالية أود أن أكتب شيئًا كهذا:

Expect.Call(delegate {dao.Save(transaction);}).Override(x => x.IsSaved=true);

لا أحد يعرف كيفية القيام بذلك؟


على الرغم من أنني حصلت على تلميح حول كيفية القيام بذلك من الإجابة المحددة أدناه، فإن توقيع النوع الفعلي معطل، لكن عليك القيام بشيء مثل هذا:بسبب ما نشره مارك إنجرام، يبدو أن أفضل إجابة، على الرغم من أنه لم يقلها أحد صراحةً، هي القيام بذلك:

public delegate void FakeSave(Transaction t);
...
Expect.Call(delegate {dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.IsSaved = true; }));
هل كانت مفيدة؟

المحلول

مضيق،

الحل الأبسط الذي وجدته ينطبق على سؤالك هو ما يلي:

Expect.Call(() => dao.Save(transaction))
    .Do(new Action<Transaction>(x => x.IsSaved = true));

لذلك لا تحتاج إلى إنشاء مندوب خاص أو أي شيء آخر.ما عليك سوى استخدام الإجراء الموجود في مكتبات .NET 3.5 القياسية.

نأمل أن تكون هذه المساعدة.فرانتيسك

نصائح أخرى

يمكنك تحقيق ذلك باستخدام رد الاتصال Do:

Expect.Call(delegate {dao.Save(transaction);})
    .Do(x => x.IsSaved = true);

يجب عليك أن تسخر من المعاملة وتجعلها تعود صحيحة لـ IsSaved، إذا كنت تستطيع الاستهزاء بالمعاملة بالطبع.

ITransaction transaction = _Mocker.dynamicMock<ITransaction>;
Expect.Call(transaction.IsSaved).IgnoreArguments.Return(true);
_mocker.ReplayAll();
dao.Save(transaction);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top