Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#和Xamarin返回null_C#_Unit Testing_Xamarin - Fatal编程技术网

模拟异步任务方法使用C#和Xamarin返回null

模拟异步任务方法使用C#和Xamarin返回null,c#,unit-testing,xamarin,C#,Unit Testing,Xamarin,我已经阅读并测试了所有这些答案(,和),但没有帮助(在这种情况下,这不是我第一次使用嘲笑,但这种情况对我来说很少见) 我使用moq和xunit进行单元测试。在测试ViewModel时,我模拟了service和page并将它们传递给它,一切正常,但没有page。CountDialog返回null,这是我的代码: Page.cs: public interface IPage { Task<PromptResult> CountDialog(decimal previousCou

我已经阅读并测试了所有这些答案(,和),但没有帮助(在这种情况下,这不是我第一次使用嘲笑,但这种情况对我来说很少见)

我使用
moq
xunit
进行单元测试。在测试
ViewModel
时,我模拟了
service
page
并将它们传递给它,一切正常,但没有
page。CountDialog
返回null,这是我的代码:

Page.cs:

public interface IPage
{
    Task<PromptResult> CountDialog(decimal previousCount);
}
公共接口IPage
{
任务计数对话框(十进制先前计数);
}
PageViewModel:

public class PageViewModel : ViewModelBase<ObservableRangeCollection<Detail>>
{
    private readonly IPage _page;
    private readonly IService _service;
    private ICommand _editItemCommand;

    public PageViewModel(IService service, IPage page)
    {
        _service = service;
        _page = page;
        Data = new ObservableRangeCollection<Detail>();
    }

    public ICommand EditItemCommand
    {
        get => _editItemCommand ??
               (_editItemCommand = new Command<Detail>(async (o) => { await EditItem(o); }));
        set => _editItemCommand = value;
    }

    public async Task EditItem(Detail detail)
    {
        if (detail == null) return;
        try
        {
            var result = await _page.CountDialog(detail.Count); // It should return PromptResult (from UserDialogs lib) but every time is null, in normal running app, it works and is Not null
            if (result == null) return; //in test is usually null
            if (!result.Ok || string.IsNullOrWhiteSpace(result.Text)) return;
            var newCount = Convert.ToInt32(result.Text);
            var res = await _service.EditItem(detail, newCount);
            if (res.Status)
                UpdatePageItem(detail, newCount);
        }
        catch (RestException exception)
        {
           // nothing
        }
    }
 }
公共类PageViewModel:ViewModelBase { 私人只读IPage页面; 私人只读设备服务; 私有ICommand_editItemCommand; 公共页面视图模型(iSeries服务,IPage页面) { _服务=服务; _页码=页码; 数据=新的ObserverAgeCollection(); } 公共ICommand editItem命令 { get=>\u editItemCommand?? (_editItemCommand=new命令(异步(o)=>{await EditItem(o);})); set=>\u editItemCommand=value; } 公共异步任务EditItem(详细信息) { if(detail==null)返回; 尝试 { var result=await _page.CountDialog(detail.Count);//它应该返回PromptResult(来自UserDialogs lib),但每次都为null,在正常运行的应用程序中,它工作并且不为null if(result==null)return;//在测试中通常为null if(!result.Ok | | string.IsNullOrWhiteSpace(result.Text))返回; var newCount=Convert.ToInt32(result.Text); var res=wait_service.EditItem(详细信息,新计数); if(res.Status) UpdatePageItem(详细信息,新计数); } 捕获(RestException异常) { //没什么 } } } ViewModelTest.cs:

public class ViewModelTest
{
    Mock<IService> _service = new Mock<IService>();
    Mock<IPage> _page = new Mock<IPage>();
    private PageViewModel _viewModel;

    public PageViewModelTest()
    {
        _viewModel = new PageViewModel(_service.Object, _page.Object);
    }

    [Fact]
    public async Task EditItemTest_SuccessAsync()
    {
        var pageItems = GetItemsFake();
        var result = new PromptResult(true, "12"); // the result i wish to be returned (but is usually null)
        _page.Setup(x => x.CountDialog(It.IsAny<int>())).ReturnsAsync(result); // this is mock part that not work
        _service.Setup(x => x.GetItems(It.IsAny<int>())).ReturnsAsync(pageItems);// works 
        _service.Setup(c => c.EditItem(It.IsAny<int>(), It.IsAny<Detail>(), It.IsAny<int>())).ReturnsAsync(
            new ActionResponse
            {
                Result = "OK"
            });//works

        _viewModel.LoadDataCommand.Execute(true);
        await _viewModel.EditItem(pageItems .ElementAt(0)); // after this line code goes to _viewModel class and there is null
        //            _viewModel.EditItemCommand.Execute(pageItems.ElementAt(0)); // Also checked this one too, but not work too

        Assert.Equal(12, _viewModel.Data.ElementAt(0).Count); // not passed due to not working mock
    }
}
公共类ViewModelTest
{
Mock _service=newmock();
Mock _page=新建Mock();
私有页面视图模型_viewModel;
公共页面ViewModelTest()
{
_viewModel=新页面viewModel(_service.Object,_page.Object);
}
[事实]
公共异步任务EditItemTest_SuccessAsync()
{
var pageItems=GetItemsFake();
var result=new PromptResult(true,“12”);//我希望返回的结果(但通常为null)
_page.Setup(x=>x.CountDialog(It.IsAny()).ReturnsAsync(result);//这是不起作用的模拟部分
_service.Setup(x=>x.GetItems(It.IsAny()).ReturnsAsync(pageItems);//有效
_service.Setup(c=>c.EditItem(It.IsAny(),It.IsAny(),It.IsAny()).ReturnsAsync(
新行动回应
{
结果=“确定”
});//工作
_viewModel.LoadDataCommand.Execute(true);
等待_viewModel.EditItem(pageItems.ElementAt(0));//在这行代码转到_viewModel类之后,出现null
//_viewModel.EditItemCommand.Execute(pageItems.ElementAt(0));//也检查了这个,但不起作用
Assert.Equal(12,_viewModel.Data.ElementAt(0.Count);//由于不工作而未传递
}
}

这是因为
CountDialog
采用的是
decimal
而不是
int

试试这个:

_page.Setup(x => x.CountDialog(It.IsAny<decimal>())).ReturnsAsync(result); 
\u page.Setup(x=>x.CountDialog(It.IsAny()).ReturnsAsync(结果);