2016-04-25 7 views
3

ich so etwas wie dieses:MSTest - Moq Setup mit einer Liste Parameter gibt leere Liste

WebRequestManagerMock 
    .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>())) 
    .Returns<IEnumerable<Order>>(orders => Task.FromResult<IEnumerabe<Item>>(m_Items.Take(orders.Count()))); 

m_Items ist eine statische Liste, die ich in der Klasse initialisieren gefüllt und ist nicht leer.

Orders ist auch nicht leer, wenn ich den Test debuggen.

Wenn ich anrufe GetItemsAsync bekomme ich 0 Artikel egal wie viele Bestellungen es gibt.

Der Schein ist auch statisch.

Mache ich etwas falsch?

Antwort

0

Ich habe eine Minimal, Complete, and Verifiable example eines Tests für Ihr Szenario neu erstellt und konnte es passieren. Schauen Sie sich die folgenden

[TestClass] 
public class MoqSetupWithListParameterTests : MiscUnitTests { 
    //m_Items is a static list I filled in the Class Initialize, and is not empty. 
    static IEnumerable<Item> m_Items = Enumerable.Range(1, 10).Select(i => new Item()); 
    //The mock is also static. 
    static Mock<IWebRequestManager> WebRequestManagerMock = new Mock<IWebRequestManager>(); 

    [TestMethod] 
    public void Items_Count_Should_Equal_Orders_Count() { 
     //Arrange 
     var expected = 3; 
     //Orders is also not empty when I debug the test. 
     var m_Orders = Enumerable.Range(1, expected).Select(i => new Order()); 
     WebRequestManagerMock 
      .Setup(x => x.GetItemsAsync(It.IsAny<IEnumerable<Order>>())) 
      .Returns<IEnumerable<Order>>(orders => Task.FromResult(m_Items.Take(orders.Count()))); 

     var sut = WebRequestManagerMock.Object; 

     //Act 
     //When I call GetItemsAsync I get expected count. 
     var actual = sut.GetItemsAsync(m_Orders).Result; 

     //Assert 
     Assert.AreEqual(expected, actual.Count()); 
    } 

    public interface IWebRequestManager { 
     Task<IEnumerable<Item>> GetItemsAsync(IEnumerable<Order> enumerable); 
    } 

    public class Order { } 
    public class Item { } 
} 
+0

Danke für die Hilfe. Aus irgendeinem Grund erkennt Visual Studio keine asynchronen Tests, und ich kann sie nicht ausführen. Ansonsten habe ich meinen Mock zum Test gebracht, und es funktioniert irgendwie, nur jetzt habe ich ein Problem mit dem Returns-Ausdruck - ohne die Liste der Order-Parameter funktioniert es, aber nicht mit ihm (der Lambda-Ausdruck) – user6251216

+0

@ user6251216, bearbeiteter Test, so dass er nicht mehr asynchron ist und immer noch funktioniert. Notieren Sie sich die Änderungen und sehen Sie, dass der Test jetzt erkannt wird. Welche Version von VS verwenden Sie und welche Version von .Net ist Ihr Targeting? – Nkosi

+0

Ursprünglich war es Visual Studio 2013 mit .NET 4, aber ich habe es kürzlich auf 2015 mit .NET 4.5 aktualisiert. Ich habe gerade ein Problem mit den 'Returns > (...)' - es wirft eine Reflektion Ausnahme in Bezug auf die Anzahl der Parameter, obwohl es nicht scheint, habe ich ein Problem mit der Klammer oder so etwas. Die normalen 'Returns' funktionieren jedoch. – user6251216

1

Anscheinend bin ich blind. Ich habe nicht bemerkt, dass ich eine neue Instanz meines Mocks in der TestInitialize-Methode erstelle. Danke, dass Sie mir gezeigt haben, dass das Problem in meinem Code und nicht in moq liegt.

Verwandte Themen