Как вы тестируете метод расширения на интерфейсе, который вызывает другой метод в этом интерфейсе с макетом, созданным Rhino Mocks? - PullRequest
1 голос
/ 20 августа 2009

Я тестирую метод расширения в интерфейсе ISomeInterface. Метод расширения фактически вызывает другой метод в интерфейсе.

Как настроить макет и соответствующие ожидания (я хочу установить ожидание, что SomeMethod, который является определенным методом в интерфейсе с другой сигнатурой, отличной от этого метода расширения, будет вызываться с помощью someDifferentParam )

// Extension Method
public static ISomeInterface SomeMethod(this ISomeInterface someInterface, string someParam)
{
    // do work, then call the defined method in the interface
    someInterface.SomeMethod(int someDifferentParam)

    return someInterface;
}


// tried to do the following but it errors
[Test]
public void SomeMethod_WithSomeInterface_CallsOtherSomeMethod()
{
    const string someParam = "something";
    const int someOtherParam = 1;

    var mock = MockRepository.GenerateMock<ISomeInterface>();

    mock.SomeMethod(someParam);

    mock.AssertWasCalled(x => x.SomeMethod(someOtherParam));
}

EDIT

Наконец-то все заработало, но я открыт для предложений / критики. Я просто изучаю все входы и выходы Rhino Mocks самостоятельно =)

вот реальная вещь, которую я тестировал. Поскольку вы не можете сравнить два объекта NHibernate.Criterion.Order, выполнив Is.Equal или Is.SameAs, мне пришлось захватить аргументы, переданные в вызов метода, а затем Assert в ToString объекта Order, потому что нет открытых свойств выставлено на это.

// Extension Method
public static class NHibernateExtensions
{
    public static ICriteria AddOrder(this ICriteria criteria, params OrderBy[] orderBys)
    {
        foreach (var b in orderBys)
        {
            var arr = b.Property.Split(',');
            for (var i = 0; i < arr.Length; i++)
            {
                criteria.AddOrder(b.Direction == OrderDirection.Ascending
                                      ? Order.Asc(arr[i])
                                      : Order.Desc(arr[i]));
            }
        }

        return criteria;
    }
}


// here is the test that works
[TestFixture]
public class NHibernateExtensionsTester : TestBase
{
    [Test]
    public void AddOrder_1OrderBy_CallsAddOrderOnICriteriaWithCorrectOrder()
    {
        const string testProperty = "SomeProperty";
        var expected = (Order.Asc(testProperty)).ToString();

        var orderBys = new[]
                       {
                           new OrderBy
                           {
                               Direction = OrderDirection.Ascending,
                               Property = testProperty
                           }
                       };

        var mockCriteria = M<ICriteria>();

        mockCriteria.AddOrder(orderBys);

        var orderArgument = (Order)((mockCriteria.GetArgumentsForCallsMadeOn(x => x.AddOrder(null)))[0][0]);
        Assert.That(orderArgument.ToString(), Is.EqualTo(expected));
    }
}

1 Ответ

3 голосов
/ 20 августа 2009

Джон, поскольку в действительности вы просто тестируете свой метод расширения, я не вижу в этом ничего плохого. Я опробовал ваш код и работал нормально для меня. Здесь - точный код, который я запустил (используя xunit.net и TD.Net). Тест пройден.

Какую ошибку вы получаете?

...