我正在尝试使用RhinoMock来模拟wcf服务。
说我有以下服务:
[OperationContract]
List<User> SearchUsers(UserSearchFilter filter);
使用Visual Studio添加此服务将生成代理,该代理具有如下界面:
public interface ResourceService {
System.IAsyncResult BeginSearchUsers(UserSearchFilter filter, System.AsyncCallback callback, object asyncState);
ObservableCollection<User> EndSearchUsers(System.IAsyncResult result);
}
然后我创建一个使用此服务的ViewModel,如下所示:
private ResourceService service;
public ViewModelBase(ResourceService serv)
{
service = serv;
var filter = new UserSearchFilter();
service.BeginSearchUsers(filter, a =>
{
this.Users = service.EndSearchUsers(a);
}, null);
}
然后是问题。如何使用RhinoMock模拟此服务?
[TestMethod]
public void UserGetsPopulatedOnCreationOfViewModel()
{
// Is stub the right thing to use?
ResourceService serv = MockRepository.GenerateStub<ResourceService>();
// Do some setup... Don't know how?
var vm = new ViewModel(serv);
Assert.IsTrue(vm.Users.Count > 0);
}
如果有人能帮我正确使用RhinoMock
,我真的很开心(注意:我正在使用Silverlight,但我认为这不会改变RhinoMock的使用方式)
非常感谢!
答案 0 :(得分:4)
我写了一篇4-part article关于测试使用WCF服务的应用程序。
Part 2谈到使用RhinoMocks嘲笑服务
Part 3讨论了使用Moq
模拟异步服务请注意,第3部分可以很容易地转换为RhinoMocks。我只是试图展示不同的模拟框架,并且该技术不依赖于模拟框架。
希望它有所帮助!
修改强> 因此,在Rhino Mocks中,您可以在设置中执行此操作:
mockService.YourEvent += null;
IEventRaiser loadRaiser = LastCall.IgnoreArguments().GetEventRaiser();
然后在播放中,你这样做:
loadRaiser.Raise(mockService, CreateEventArgs());
您可以在Phil Haack's blog post中找到有关Rhino中模拟事件的更多信息。
答案 1 :(得分:1)
我会创建服务将实现的接口(IResourceService)。 然后在Silverlight端创建调用WCF服务本身的IResourceService的自定义实现。
RihnoMock将为IResourceService接口创建存根,而不是为WCF服务。
使用Prism 2非常容易,你可以在这里阅读更多内容:
http://mokosh.co.uk/post/2009/04/19/prism-2-wpf-and-silverlight-services/