【问题标题】:How do you test an extension method on an Interface which calls another method in that Interface with a mock created by Rhino Mocks?你如何测试一个接口上的扩展方法,该方法调用该接口中的另一个方法,并使用由 Rhino Mocks 创建的模拟?
【发布时间】:2009-08-19 22:34:13
【问题描述】:

我正在接口“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));
}

编辑

我终于让它工作了,但我愿意接受建议/批评。我只是在自己学习 Rhino Mocks 的来龙去脉 =)

这是我正在测试的真实内容。由于您无法通过执行 Is.Equal 或 Is.SameAs 来比较两个 NHibernate.Criterion.Order 对象,因此我必须捕获传递给方法调用的参数,然后在 Order 对象的 ToString 上进行断言,因为没有公共属性暴露在上面。

// 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));
    }
}

【问题讨论】:

    标签: unit-testing mocking rhino-mocks


    【解决方案1】:

    乔恩,因为实际上你只是在测试你的扩展方法,我看不出有什么问题,这个。我尝试了您的代码,对我来说效果很好。 Here 是我运行的确切代码(使用 xunit.net 和 TD.Net)。测试通过了。

    你遇到了什么错误?

    【讨论】:

    • 我认为我的问题不在于测试,而在于引用类型,someOtherParam 是引用类型(不是我上面示例中的 int)
    • 我让它工作了,我不得不用 mock.GetArgumentsForCallsMadeOn(x => x.SomeMethod(null)) 提出论点
    猜你喜欢
    • 2022-01-23
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多