0

我在最小起订量中遇到了一个非常奇怪的行为,我不明白这是一个错误还是我做错了什么。这是示例:

List<CustomerDataTransaction> transactions0 = GetTransactionsSomehow();
List<CustomerDataTransaction> transactions1 = GetTransactionsSomehow();

var portfolioTransactions0 = new List<IPortfolioTransaction>();
var portfolioTransactions1 = new List<IPortfolioTransaction>();

m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions0))
    .Returns(portfolioTransactions0);

m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions1))
    .Returns(portfolioTransactions1);

我已经检查了 transaction0 不等于 transactions1,所以它肯定是不同的列表。但是,当使用不同的参数(transactions0 和 transactions1)调用时,mock 会两次返回投资组合交易 1。我试图找出问题所在,但我没有找到任何原因。然后我在每个列表中添加了虚拟元素并修复了它,模拟开始按计划返回不同的值。这是 Mock 的错误还是我没有得到什么?据我了解,列表中的值根本不应该影响它。

PS我不知道它是否重要但方法接受IEnumerable<CustomerDataTransaction>

4

2 回答 2

0

考虑尝试:

It.Is<IEnumerable<CustomerDataTransaction>>(t => t == transactions1))

从记忆中我认为起订量使用了引用相等

于 2013-04-12T11:05:19.017 回答
0

扩展 NinjaNye 的答案,使用 It.Is 满足测试是因为它确保您正在查看对象的确切实例,而不是相等运算符。

使用您的测试框架,如果您说 Assert.NotEqual 并给它两个对象,它会使用相等运算符并说一个空列表等于另一个。考虑能够将 objectA.Property1 与 objectA.Property2 进行比较。Assert.Equal 将查看值而不是值的实例是有道理的。

Xunit 提供了一个方法 Assert.Same,它将提供与 Moq 的 It.Is<> 相同的功能,验证它是对象的同一个实例。我相信当今大多数流行的测试框架都提供了类似的行为。

于 2013-04-13T14:45:21.570 回答