【发布时间】: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