Rhino Mock Partial Stub должен быть публичным методом? - PullRequest
2 голосов
/ 23 декабря 2010

Я написал несколько модульных тестов с использованием Rhino Mocks, и я доволен результатами, за исключением того факта, что мне пришлось представить базовый веб-сервис как общедоступный виртуальный (isUserInRoleWebService), предположительно, потому что это моя заглушкаиздеваться.Я обычно использую рефлексию, чтобы не показывать закрытые методы, но это не сработает на объекте.Кто-нибудь обходил это?Должен быть общий сценарий.

[SetUp]
public void SetUp()
{
    _mockRepository = new MockRepository();
    _entitlementCache = _mockRepository.PartialMock<EntitlementCache>();
}

[Test]
// simple test to verify membership of a single role
public void Test_SingleRoleMember()
{
    (new ReflectedObject(_entitlementCache)).InvokeInstanceMethod(
                                                "setRoleHierachy", 
                                                new object[] { hierachy2Level }
                                             );

    using (_mockRepository.Record())
    {
        // I had to convert isUserInRoleWebService to public :-(
        _entitlementCache.Stub(x => x.isUserInRoleWebService("user", "Role 1"))
                         .Repeat
                         .Once()
                         .Return(true);
    }

    using (_mockRepository.Playback())
    {
        bool res = _entitlementCache.IsUserInRole("user", "Role 1");
        Assert.AreEqual(true, res, "user member of 'Role 1'");
    }
}

[TearDown]
public void TearDown()
{
    _mockRepository.ReplayAll();
    _mockRepository.VerifyAll();
}

Ответы [ 2 ]

3 голосов
/ 16 июля 2015

Вы можете использовать частичные макеты для переопределения protected internal virtual методов. Обратите внимание, что вам необходимо указать [InternalsVisibleTo("YourTestProject")] в AssemblyInfo.cs тестируемого проекта.

protected internal (или protected internal, если вы предпочитаете) - это объединение protected и internal. Так, internal + [InternalsVisibleTo] делает метод видимым для вашего тестового проекта, а protected позволяет Rhino переопределять метод virtual.

1 голос
/ 23 декабря 2010

Как правило, я не проверяю и не высмеиваю частные методы. Похоже, что в этом случае для вас может быть лучше сделать сам веб-сервис доступным как свойство в вашем кеше, а затем смоделировать это. Например:

IWebService service = ...
service.Expect(s => s.IsUserInRoleWebService("user", "Role 1")).Return(true);

EntitlementCache cache = ...
cache.Service = service;

bool result = cache.IsUserInRole("user", "Role 1");
Assert.IsTrue(result, "user member of 'Role 1'");
...