2016-04-25 13 views
3

我有這樣的事情:MSTest的 - 起訂量建立一個列表參數返回空列表

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

m_Items是一個靜態列表我填寫在類初始化,而不是空的。

Orders當我調試測試時也不是空的。

當我打電話GetItemsAsync無論訂單有多少,我都會得到0件商品。

該模擬也是靜態的。

我做錯了什麼?

回答

0

我爲您的場景重新創建了一個測試Minimal, Complete, and Verifiable example,並且能夠讓它通過。看看下面的內容

[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

感謝您的幫助。出於某種原因,Visual Studio不能識別異步測試,並且我無法運行它們。除此之外,我把我的模擬移動到了它自己的測試中,它有點作用,直到現在我有一個返回表達式的問題 - 沒有它的工作參數列表,但沒有它(lambda表達式) – user6251216

+0

@ user6251216,編輯測試,以便它不再是異步並仍然有效。記下這些變化,看看它現在會識別測試。您使用的是什麼版本的VS,以及.Net的哪個版本是您的目標 – Nkosi

+0

最初是使用.NET 4的Visual Studio 2013,但最近我使用.NET 4.5將其升級到了2015。我目前對'Returns >(...)'有問題 - 它引發了一個關於參數數量的反射異常,儘管似乎我沒有問題。正常的'Returns'雖然工作。 – user6251216

1

顯然我是盲人。我沒有注意到我在TestInitialize方法中創建了我的模擬的新實例。感謝您向我展示問題出在我的代碼中,而不是在moq中。