模拟异步任务方法使用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(结果);