我有一个类似于这样的类:
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); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。