【问题标题】:MSTest - Moq setup with a list parameter returns empty listMSTest - 带有列表参数的 Moq 设置返回空列表
【发布时间】:2016-04-25 11:50:02
【问题描述】:

我有这样的事情:

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

m_Items是我在Class Initialize中填写的静态列表,不为空。

Orders 在我调试测试时也不为空。

当我致电GetItemsAsync 时,无论有多少订单,我都会得到 0 件商品。

模拟也是静态的。

我做错了什么吗?

【问题讨论】:

    标签: c# unit-testing mocking moq mstest


    【解决方案1】:

    显然我是盲人。我没有注意到我在 TestInitialize 方法中创建了我的模拟的新实例。感谢您向我展示问题出在我的代码中,而不是在起订量中。

    【讨论】:

      【解决方案2】:

      我为您的场景重新创建了一个测试的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 { }
      }
      

      【讨论】:

      • 感谢您的帮助。出于某种原因,Visual Studio 无法识别异步测试,我无法运行它们。除此之外,我将我的模拟移到了它自己的测试中,它有点工作,只是现在我遇到了 Returns 表达式的问题 - 没有订单参数列表它可以工作,但不能使用它(lambda 表达式)跨度>
      • @user6251216,编辑了测试,使其不再是异步的并且仍然有效。注意更改并看到它现在会识别测试。您使用的是什么版本的 VS,您的目标是什么版本的 .Net
      • 最初它是带有 .NET 4 的 Visual Studio 2013,但我最近将它升级到带有 .NET 4.5 的 2015。我目前遇到了Returns&lt;IEnumerable&lt;Order&gt;&gt;(...) 的问题-它引发了关于参数数量的反射异常,尽管括号之类的东西似乎没有问题。普通的Returns 可以工作。
      • 异步测试返回任务;不要使用 void
      • @JeroenHeier 我最初有任务,但发帖人说他们的版本不允许他们将任务与测试一起使用
      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多