Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟这个异步方法?_C#_Unit Testing_Asynchronous_Mocking_Moq - Fatal编程技术网

C# 如何模拟这个异步方法?

C# 如何模拟这个异步方法?,c#,unit-testing,asynchronous,mocking,moq,C#,Unit Testing,Asynchronous,Mocking,Moq,我有一个大致如下的类: public class ViewModel { public ViewModel(IWebService service) { this.WebService = service; } private IWebService WebService{get;set;} private IEnumerable<SomeData> MyData{get;set;} private void GetReferenceData(

我有一个大致如下的类:

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)
{
this.WebService=service;
}
私有IWebService Web服务{get;set;}
私有IEnumerable MyData{get;set;}
私有void GetReferenceData()
{
this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete,null);
}
私有void GetReferenceDataOnComplete(IAsyncResult结果)
{
this.MyData=this.WebService.EndGetStaticReferenceData(结果);
}
.
.
.
}
我想模拟我的IWebService接口,以便在调用BeginGetStaticReferenceData时能够调用回调方法。我用的是最小起订量,我不知道怎么做。我的单元测试设置代码如下所示:

//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);
.
.
//排列
var service=newmock();
service.Setup(x=>x.BeginGetStaticReferenceData(/*……不知道……*/);
Setup(x=>x.EndGetStaticReferenceData(It.IsAny()).Returns(new List{new SomeData{Name=“blah”});
var viewModel=新的viewModel(service.Object);
.
.
这篇文章很好地解释了如何使用Rhino Mock测试异步方法-我相信它可以很容易地改为使用Moq。

以下是如何:

[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);
}
[TestMethod]
公开测试10()
{
var expectedData=new[]{new SomeData(),new SomeData()};
AsyncCallback=null;
IAsyncResult ar=新建Mock().Object;
var webServiceStub=new Mock();
webServiceStub
.Setup(ws=>ws.BeginGetStaticReferenceData(It.IsAny(),null))
.Callback((异步回调cb,对象状态)=>Callback=cb)
.应收账款(ar);
webServiceStub
.Setup(ws=>ws.EndGetStaticReferenceData(It.IsAny()))
.返回(预期数据);
var sut=newviewmodel(webServiceStub.Object);
sut.DoIt();
回收(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);
    }
}
公共类视图模型
{
公共视图模型(IWebService)
{
this.WebService=service;
}
公共IEnumerable MyData{get;set;}
公共无效DoIt()
{
此参数为.GetReferenceData();
}
私有IWebService Web服务{get;set;}
私有void GetReferenceData()
{
this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete,null);
}
私有void GetReferenceDataOnComplete(IAsyncResult结果)
{
this.MyData=this.WebService.EndGetStaticReferenceData(结果);
}
}

我尝试将其用于UdpClient,只有当我将您的回调从
=>callback=cb
更改为
=>cb(ar)
时,它才起作用。不知道我是否已经黑客怪物或什么…什么是模拟类以上?是你的课还是我需要添加一些参考来使用它?