c# – 我如何模拟这个异步方法?
发布时间:2020-12-15 06:54:21 所属栏目:百科 来源:网络整理
导读:我有一个类似于这样的类: public class ViewModel{ public ViewModel(IWebService service) { this.WebService = service; } private IWebService WebService{get;set;} private IEnumerableSomeData MyData{get;set;} private void GetReferenceData() { t
我有一个类似于这样的类:
public class ViewModel { public ViewModel(IWebService service) { this.WebService = service; } private IWebService WebService{get;set;} private IEnumerable<SomeData> MyData{get;set;} private void GetReferenceData() { this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete,null); } private void GetReferenceDataOnComplete(IAsyncResult result) { this.MyData = this.WebService.EndGetStaticReferenceData(result); } . . . } 我想嘲笑我的IWebService接口,以便在调用BeginGetStaticReferenceData时可以调用回调方法.我正在使用Moq,我无法解决如何做到这一点.我的单元测试设置代码看起来像: //Arrange var service = new Mock<IWebService>(); service.Setup(x => x.BeginGetStaticReferenceData(/*.......don't know.....*/)); service.Setup(x => x.EndGetStaticReferenceData(It.IsAny<IAsyncResult>())).Returns(new List<SomeData>{new SomeData{Name="blah"}}); var viewModel = new ViewModel(service.Object); . . 解决方法
就是这样:
[TestMethod] public void Test10() { var expectedData = new[]{new SomeData(),new SomeData()}; AsyncCallback callback = null; IAsyncResult ar = new Mock<IAsyncResult>().Object; var webServiceStub = new Mock<IWebService>(); webServiceStub .Setup(ws => ws.BeginGetStaticReferenceData(It.IsAny<AsyncCallback>(),null)) .Callback((AsyncCallback cb,object state) => callback = cb) .Returns(ar); webServiceStub .Setup(ws => ws.EndGetStaticReferenceData(It.IsAny<IAsyncResult>())) .Returns(expectedData); var sut = new ViewModel(webServiceStub.Object); sut.DoIt(); callback(ar); Assert.AreEqual(expectedData,sut.MyData); } 这个测试假定了一个稍微修改的ViewModel,我添加了几个公共成员来测试一些东西: public class ViewModel { public ViewModel(IWebService service) { this.WebService = service; } public IEnumerable<SomeData> MyData { get; set; } public void DoIt() { this.GetReferenceData(); } private IWebService WebService { get; set; } private void GetReferenceData() { this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete,null); } private void GetReferenceDataOnComplete(IAsyncResult result) { this.MyData = this.WebService.EndGetStaticReferenceData(result); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |