当前位置: 首页 > 知识库问答 >
问题:

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

费学
2023-03-14

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

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

页反恐精英:

public interface IPage
{
    Task<PromptResult> CountDialog(decimal previousCount);
}

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
        }
    }
 }

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
    }
}

共有1个答案

逄俊贤
2023-03-14

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

试试这个:

_page.Setup(x => x.CountDialog(It.IsAny<decimal>())).ReturnsAsync(result); 
 类似资料:
  • 本文向大家介绍C#异步执行任务的方法,包括了C#异步执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍SpringBoot异步任务使用方法详解,包括了SpringBoot异步任务使用方法详解的使用技巧和注意事项,需要的朋友参考一下 步骤,如图所示: 1.添加异步任务业务类 2.添加测试控制器 3.添加启动类 4.右键项目Run As启动,访问url 结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 我在尝试单元测试函数调用时遇到了一个问题。尽管调用已被存根,但由于无效方法调用而失败。 请在下面找到我的代码的简化快照。我正在使用do答案()存根来模拟空方法(基于StackOverflow上的早期答案)。 我甚至尝试了其他选项的和存根,但当调用存根方法时,它们也会在相同的NPE中失败:(。 如果有人能提出解决方案/解决方法,我将不胜感激。非常感谢。 考试班 正在测试的实现类,来自该类的存根方法调

  • 我有一个从实体框架类派生的类,如下所示。 当我将“void”更改为“异步任务”时,我得到以下编译器错误。 async/Await最佳实践告诉您,几乎总是返回异步任务,而不是void。我只是想确保我在这里对void的使用是那些可以接受的使用void的场景之一。我还有别的选择吗?