相关疑难解决方法(0)

等待Async Void方法调用进行单元测试

我有一个看起来像这样的方法:

private async void DoStuff(long idToLookUp)
{
    IOrder order = await orderService.LookUpIdAsync(idToLookUp);   

    // Close the search
    IsSearchShowing = false;
}    

//Other stuff in case you want to see it
public DelegateCommand<long> DoLookupCommand{ get; set; }
ViewModel()
{
     DoLookupCommand= new DelegateCommand<long>(DoStuff);
}    
Run Code Online (Sandbox Code Playgroud)

我试图对它进行单元测试:

[TestMethod]
public void TestDoStuff()
{
    //+ Arrange
    myViewModel.IsSearchShowing = true;

    // container is my Unity container and it setup in the init method.
    container.Resolve<IOrderService>().Returns(orderService);
    orderService = Substitute.For<IOrderService>();
    orderService.LookUpIdAsync(Arg.Any<long>())
                .Returns(new Task<IOrder>(() => null));

    //+ Act
    myViewModel.DoLookupCommand.Execute(0);

    //+ Assert
    myViewModel.IsSearchShowing.Should().BeFalse(); …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing async-await

63
推荐指数
6
解决办法
8万
查看次数

MVVM Light RelayCommand参数

我在使用GalaSoft MVVM Light框架将参数传递给relaycommand时遇到问题.我知道mvvm light的relay命令的实现不使用lambda参数,所以我做了一些研究,并找到了一种方法,人们通过做这样的事情来解决它:

public RelayCommand ProjMenuItem_Edit
{
    get
    {
        if (_projmenuItem_Edit == null)
        {
            //This should work....
            _projmenuItem_Edit = new RelayCommand(ProjEditNode);
        }
        return _projmenuItem_Edit;
    }
}

private void ProjEditNode(object newText)
{
    var str = newText as string;
    OrganLocationViewModel sel = 
        ProjectOrganLocationView.GetExtendedTreeView().GetTopNode();

    //Console.WriteLine(sel.OrganDisplayName);
    sel.OrganDisplayName = str;
}
Run Code Online (Sandbox Code Playgroud)

但是,我一直在_projmenuItem_Edit = new RelayCommand(ProjEditNode);说错误Argument 1: cannot convert from 'method group' to 'System.Action'

我错过了什么?

c# wpf relaycommand mvvm-light

45
推荐指数
1
解决办法
5万
查看次数

如何单元测试在MVVM中调用异步方法的DelegateCommand

我是单元测试MVVM的新手,并在我的项目中使用PRISM.我正在我们当前的项目上实现单元测试,没有运气在线查找资源,这将告诉我如何调用异步方法的totest DelegateCommand.这是我的帖子的后续问题 - 如何使用异步方法对ViewModel进行单元测试.关于如何在MVVM中单元测试异步方法,并回答公共方法可以使用异步TestMethod进行测试.仅当我要测试的方法是公共方法时,此方案才有效.

问题是我想测试我的DelegateCommand,因为这是我想在其他类上公开的唯一公共细节,其他一切都是私有的.我可以公开我的私人方法,但我永远不会这样做,因为它是一个糟糕的设计.我不知道如何解决这个问题 - 是否需要对DelegateCommand进行测试,还是有其他一些工作要做?我很想知道其他人如何去做,并以某种方式引导我走向正确的道路.

这是我的代码

 async void GetTasksAsync()
        {
            this.SimpleTasks.Clear();
            Func<IList<ISimpleTask>> taskAction = () =>
                {
                    var result = this.dataService.GetTasks();
                    if (token.IsCancellationRequested)
                        return null;
                    return result;
                };
            IsBusyTreeView = true;

            Task<IList<ISimpleTask>> getTasksTask = Task<IList<ISimpleTask>>.Factory.StartNew(taskAction, token);
            var l = await getTasksTask;          // waits for getTasksTask


            if (l != null)
            {
                foreach (ISimpleTask t in l)
                {
                    this.SimpleTasks.Add(t); // adds to ViewModel.SimpleTask
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

这里也是我的VM中的命令,它调用上面的异步方法

  this.GetTasksCommand = new DelegateCommand(this.GetTasks);
      void GetTasks()
        {
                GetTasksAsync();
        }
Run Code Online (Sandbox Code Playgroud)

现在我的测试方法就像

 [TestMethod]
        public …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing prism mvvm delegatecommand

13
推荐指数
1
解决办法
6075
查看次数