我試圖測試一些我已經寫入的代碼試圖嘲笑使用Machine.Fakes(它使用引擎蓋下的Moq)的func的問題。有關示例,請參閱下面的代碼。如何使用Machine.Fakes(Moq)來模擬Func <>?
public class RoutingEngine : IRoutingEngine
{
private readonly IMessageRouters _messageRouters;
public RoutingEngine(IMessageRouters messageRouters)
{
_messageRouters = messageRouters;
}
public void Route<T>(T inbound)
{
var messageRouters = _messageRouters.Where(x => x.CanRoute(inbound));
foreach(var router in messageRouters)
router.Route(inbound);
}
}
public class MessageRouters : IMessageRouters
{
public IList<IMessageRouter> _routers = new List<IMessageRouter>();
public IEnumerable<IMessageRouter> Where(Func<IMessageRouter, bool> func)
{
return _routers.Where(func);
}
public void Add(IMessageRouter messageRouter)
{
_routers.Add(messageRouter);
}
}
而且測試是在這裏
public class when_routing_a_message_with_fakes : WithSubject<RoutingEngine>
{
Establish that =() =>
{
Message = new MyMessage{ SomeValue= 1, SomeOtherValue = 11010 };
Router = The<IMessageRouter>();
Router.WhenToldTo(x => x.CanRoute(Message)).Return(true);
The<IMessageRouters>().WhenToldTo(x => x.Where(router => router.CanRoute(Message))).Return(new List<IMessageRouter> { Router });
};
Because of =() => Subject.Route(Message);
It should_do_route_the_message =() => Subject.WasToldTo(x => x.Route(Param.IsAny<MyMessage>()));
static MyMessage Message;
static IMessageRouter Router;
}
我得到一個不支持的表達式上面,所以我改變了對IMessageRouters
在那裏方法如下:
public IEnumerable<IMessageRouter> Where(Expression<Func<IMessageRouter, bool>> func)
{
return _routers.Where(func.Compile());
}
現在我得到這個錯誤
對象實例不是由Moq創建的。
參數名稱:嘲諷
任何想法?
編輯
於是,我試着寫另一個測試不machine.fakes,按Mocking methods with Expression<Func<T,bool>> parameter using Moq。原來這是一個明顯的問題。在現實RoutingEngine使用的func被未被嘲笑
The<IMessageRouters>()
.WhenToldTo(x => x.Where(router => router.CanRoute(Param.IsAny<ProcessSkuCostUpdated>())))
.Return(new List<IMessageRouter> {Router});
上述對無軸承凡在運行時被執行,並作爲func被編譯成在編譯時的私有方法是不可能的。似乎喜歡模擬func,我需要將它推到一個界面。聞起來,因爲我只是爲了測試而推動內部行爲。