لا يبدو توقع على وجوه وهمية الواجب توافرها (موك)

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

  •  10-07-2019
  •  | 
  •  

سؤال

وأنا تعاني من بعض السلوك الغريب في موك - على الرغم من أن الإعداد أنا كائن وهمي للعمل بطريقة معينة، ومن ثم استدعاء الأسلوب وبنفس الطريقة بالضبط في كائن أنا الاختبار، ويتفاعل كما لو كانت طريقة تسمى أبدا.

ولدي عمل تحكم التالية التي أحاول أن الاختبار:

public ActionResult Search(string query, bool includeAll)
{
    if (query != null)
    {
        var keywords = query.Split(' ');
        return View(repo.SearchForContacts(keywords, includeAll));
    }
    else
    {
        return View();
    }
}

وحدتي رمز اختبار:

public void SearchTestMethod() // Arrange
    var teststring = "Anders Beata";
    var keywords = teststring.Split(' ');
    var includeAll = false;
    var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
    repository
        .Expect(r => r.SearchForContacts(keywords, includeAll))
        .Returns(expectedModel)
        .Verifiable();

    // Act
    var result = controller.Search(teststring, includeAll) as ViewResult;

    // Assert
    repository.Verify();
    Assert.IsNotNull(result);
    AssertThat.CollectionsAreEqual<Contact>(
        expectedModel, 
        result.ViewData.Model as IEnumerable<Contact>
    );
}

وحيث AssertThat هو مجرد فئة من بلدي مع مجموعة من المساعدين التأكيد (لأن الطبقة Assert لا يمكن تمديدها مع طرق الإرشاد ... تنهد ...).

وعند تشغيل الاختبار، فإنه فشل في خط repository.Verify()، مع MoqVerificationException:

Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod()
threw exception:  Moq.MockVerificationException: The following expectations were not met:
IRepository r => r.SearchForContacts(value(System.String[]), False)

إذا كنت إزالة repository.Verify()، فشل ASSERT جمع تقول لي أن هذا النموذج هو عاد null. لقد تصحيحه ودققت أن query != null، وأنني اتخذت في جزء من كتلة if حيث يتم تشغيل التعليمات البرمجية. لا مشاكل هناك.

لماذا لا هذا العمل؟

هل كانت مفيدة؟

المحلول

وأظن انه بسبب المصفوفة التي كنت تمر في مستودع سخر الخاص بك (نتيجة teststring.Split(' ')) ليست هي نفس موضوع واحد في الواقع أن يحصل تمريرها من طريقة البحث (نتيجة query.Split(' ')).

وحاول استبدال السطر الأول من التعليمات البرمجية الإعداد مع:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))

... والتي سوف مقارنة كل عنصر من المصفوفة التي تم تمريرها إلى وهمية مع العنصر المطابق في مجموعة keywords.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top