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# MOQ使用不同的事件参数多次引发事件_C#_Unit Testing_Windows Phone 7_Moq - Fatal编程技术网

C# MOQ使用不同的事件参数多次引发事件

C# MOQ使用不同的事件参数多次引发事件,c#,unit-testing,windows-phone-7,moq,C#,Unit Testing,Windows Phone 7,Moq,我正在尝试测试一个异步进程,其中对具有不同值的服务发出多个请求,从而引发多个完成事件 该应用程序是WP7应用程序,包含WP7类库项目中的代码和测试,所有其他模拟测试都可以正常工作。只有这个测试我无法工作 测试是: [Test] public void Should_referesh_all_stocks_held_in_collection() { var fakeStockService = new Mock<IStockService>()

我正在尝试测试一个异步进程,其中对具有不同值的服务发出多个请求,从而引发多个完成事件

该应用程序是WP7应用程序,包含WP7类库项目中的代码和测试,所有其他模拟测试都可以正常工作。只有这个测试我无法工作

测试是:

    [Test]
    public void Should_referesh_all_stocks_held_in_collection()
    {
        var fakeStockService = new Mock<IStockService>();
        var msftStock = new StockViewModel { Symbol = "MSFT", Name = "Microsoft", Price = 12.5m, Change = "+1" };

        var googStock = new StockViewModel { Symbol = "GOOG", Name = "Google", Price = 12.0m, Change = "-1" };

        var target = new StockSummaryViewModel(fakeStockService.Object);

        target.Stocks.Add(msftStock);
        target.Stocks.Add(googStock);

        fakeStockService.Setup(s => s.GetStock("MSFT"))
            .Raises(s => s.StockQuoteReceived += null, new StockQuoteEventArgs(new QuoteReceived { Symbol = "MSFT", Name = "Microsoft Corp", Last = "13.5", Change = "+1" }));

        fakeStockService.Setup(s => s.GetStock("GOOG"))
            .Raises(s => s.StockQuoteReceived += null, new StockQuoteEventArgs(new QuoteReceived { Symbol = "GOOG", Name = "Google", Last = "11.5", Change = "-0.5" }));

        target.Refresh();

        Assert.AreEqual(2, target.Stocks.Count);
        var stock = target.Stocks.Single(s => s.Symbol == "MSFT");

        Assert.IsTrue(stock.Change == "+1" && stock.Price == 13.5m);

        stock = target.Stocks.Single(s => s.Symbol == "GOOG");
        Assert.IsTrue(stock.Change == "-0.5" && stock.Price == 11.5m);
    }
测试失败,因为未激发第二个事件,而第一个事件激发了两次


我遗漏了什么?

您确定GetStock方法被调用了两次,参数不同吗?是的。在测试中,您将看到两个stock被添加到stocks集合中,refresh方法在集合上执行for循环,调用您在fake中看到的GetStock方法。当我调试代码时,我看到2个对GetStock的调用具有正确的值,但只有MSFT模拟事件被引发。您可能会尝试将事件args排队,因为您非常清楚对GetStock方法的调用顺序。说到排队,这里有一个关于在连续的方法调用中返回不同结果的示例。也许您可以根据您的情况调整ReturnsOrder扩展方法,即调用提升而不是返回/cc@AD.net事件引发设置没有任何问题,它按预期工作,我无法重新处理您的问题。我为不同的调用获取不同的事件参数。所以我想问题出在你的实现中。能否发布刷新方法,以及订阅StockQuoteReceived事件或完整StockSummaryViewModel的方式和地点?是否确定使用不同参数调用GetStock方法两次?是的。在测试中,您将看到两个stock被添加到stocks集合中,refresh方法在集合上执行for循环,调用您在fake中看到的GetStock方法。当我调试代码时,我看到2个对GetStock的调用具有正确的值,但只有MSFT模拟事件被引发。您可能会尝试将事件args排队,因为您非常清楚对GetStock方法的调用顺序。说到排队,这里有一个关于在连续的方法调用中返回不同结果的示例。也许您可以根据您的情况调整ReturnsOrder扩展方法,即调用提升而不是返回/cc@AD.net事件引发设置没有任何问题,它按预期工作,我无法重新处理您的问题。我为不同的调用获取不同的事件参数。所以我想问题出在你的实现中。您能否发布您的刷新方法,以及如何订阅StockQuoteReceived事件或完整的StockSummaryViewModel,以及在何处订阅?