- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想模拟一个继承自 IReadOnlyCollection 的类。我写了一些示例代码来演示我的问题。三项断言中有两项有效。
当我将模拟的 IRemainingSteps 转换为列表或使用 LINQ 时,列表为空。
请解释一下我应该如何更改 GetEnumerator 的设置以允许所有三个断言通过。
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Moq;
using NUnit.Framework;
namespace BranchScript.UT
{
[TestFixture]
public class Steps
{
[Test]
public void Test()
{
// Arrange
string branchA = "branch a";
string branchB = "branch b";
var mockStep1 = new Mock<IRemainingStep>();
mockStep1.Setup(x => x.StepNotes).Returns(branchA);
var mockStep2 = new Mock<IRemainingStep>();
mockStep2.Setup(x => x.StepNotes).Returns(branchB);
var mockStep3 = new Mock<IRemainingStep>();
mockStep3.Setup(x => x.StepNotes).Returns(branchA);
var mockStep4 = new Mock<IRemainingStep>();
mockStep4.Setup(x => x.StepNotes).Returns(branchB);
List<IRemainingStep> mockStepList = new List<IRemainingStep>
{
mockStep1.Object,
mockStep2.Object,
mockStep3.Object,
mockStep4.Object
};
var refs = new Mock<IRemainingSteps>(MockBehavior.Strict);
refs.Setup(r => r.GetEnumerator()).Returns(mockStepList.GetEnumerator());
refs.As<IEnumerable>().Setup(r => r.GetEnumerator()).Returns(mockStepList.GetEnumerator());
var mockPlate = new Mock<IPlate>();
mockPlate.Setup(x => x.RemainingSteps).Returns(refs.Object);
// Assert
Assert.AreEqual(branchA, mockPlate.Object.RemainingSteps.First().StepNotes); // Pass
Assert.AreEqual(branchB, mockPlate.Object.RemainingSteps.Last().StepNotes); // Pass
Assert.AreEqual(2, mockPlate.Object.RemainingSteps.Where(x => x.StepNotes == branchA).Count()); // Fail
}
}
public interface IRemainingSteps : IReadOnlyCollection<IRemainingStep>
{
}
public interface IRemainingStep : IStep
{
}
public interface IStep
{
string StepNotes { get; }
}
public interface IPlate
{
IRemainingSteps RemainingSteps { get; }
}
}
最佳答案
传回 Enumerator 只允许一次读取,因为它是只向前的。
var refs = new Mock<IRemainingSteps>(MockBehavior.Strict);
refs.Setup(r => r.GetEnumerator()).Returns(mockStepList.GetEnumerator());
refs.As<IEnumerable>().Setup(r => r.GetEnumerator()).Returns(mockStepList.GetEnumerator());
但是如果模拟返回一个函数,它将允许重复调用枚举器
var refs = new Mock<IRemainingSteps>(MockBehavior.Strict);
refs.Setup(r => r.GetEnumerator()).Returns(() => mockStepList.GetEnumerator());
refs.As<IEnumerable>().Setup(r => r.GetEnumerator()).Returns(() => mockStepList.GetEnumerator());
注意 Returns
中函数调用的使用
.Returns(() => mockStepList.GetEnumerator())
当您仍在枚举器中前进时,前两个断言起作用。
Assert.AreEqual(branchA, mockPlate.Object.RemainingSteps.First().StepNotes); // Pass
Assert.AreEqual(branchB, mockPlate.Object.RemainingSteps.Last().StepNotes); // Pass
根据第三个断言,指针已经在末尾
Assert.AreEqual(2, mockPlate.Object.RemainingSteps.Where(x => x.StepNotes == branchA).Count()); // Fail
所以计数不会像预期的那样。
关于c# - 继承自 IReadOnlyCollection 的 Mock 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57173297/
我正在为 MultiValueDictionary 创建一个扩展方法封装频繁ContainsKey检查,我想知道创建空 IReadOnlyCollection 的最佳方法是什么?。 到目前为止我使用的
我正在使用 selenium,我正在使用 FindElements 函数,所以我得到了一个实现 IReadOnlyCollection 接口(interface)的元素。我想遍历列表,但 IReadO
SO 上已经有几个类似的问题,但我发现没有一个真正涉及到这个特定主题,所以这里... 我的理解是,应该始终尝试通过具体类返回接口(interface)。不会深入探讨其背后的原因,已经有很多关于它的事情
我有IEnumerable并且需要传递给一个方法作为参数但是这个方法需要IReadOnlyCollection 是否可以转换IEnumerable至 IReadOnlyCollection ? 最佳答
为什么不同的集合(都实现了 IReadOnlyCollection 接口(interface))在试图将它们变成 IReadOnlyCollection 时被编译器以不同的方式处理。 ? IReadO
我想为 ICollection 和 IReadonlyCollection 接口(interface)编写扩展方法(例如 .IsEmpty()): public static bool IsEmpty
以下三种方法是否具有等效的垃圾回收行为? #1 有点牵强,但今天的 C# 编译器是否足够聪明,可以在每次调用方法时优化#2 中的对象创建?我特别不想在方法之外提升数组初始化。 public B
我的模型(使用 Entity Framework 生成,请记住我已针对示例对其进行了简化)如下所示: public class Person { public string Name { ge
我有一个 HashSet,我正试图将其转换为 IReadOnlyCollection,但出现错误: Cannot implicitly convert type 'System.Collections
我想模拟一个继承自 IReadOnlyCollection 的类。我写了一些示例代码来演示我的问题。三项断言中有两项有效。 当我将模拟的 IRemainingSteps 转换为列表或使用 LINQ 时
我正在迭代取自 HTML 的元素。 structureElement 似乎包含找到的元素,但是当我在其上运行 .FindElement() 时,它始终返回第一次迭代的值。这是为什么? 这是我的代码:
.NET 4.5 中新的只读接口(interface),例如 IReadOnlyCollection 和 IReadOnlyDictionary 非常有用,特别是因为它们已在常见的 BCL 类型上实现
我怀疑我对 System.Collection.Generic.IReadOnlyCollection 的理解语义并怀疑如何使用只读和不可变等概念进行设计。让我用 documentation 来描述我
我有一个私有(private)领域IList _elements并想要创建一个返回 IReadOnlyCollection 的属性. public IReadOnlyCollection BaseCl
当我有一个 ICollection 的变量时在 C# 中,我无法将它传递给需要 IReadOnlyCollection 的函数: public void Foo() { ICollection d
我刚刚发现 .NET Fx 现在有 3 个有用的接口(interface): IReadOnlyCollection IReadOnlyList IReadOnlyDictionary 我有点困惑为什
我正在处理对象的 IReadOnlyCollection。 现在我有点惊讶,因为我可以使用 linq 扩展方法 ElementAt()。但我无权访问 IndexOf()。 这对我来说看起来有点不合逻辑
这个问题看起来很简单。虽然documentation说是的: public sealed class KeyCollection : ICollection, IReadOnlyCollect
List工具 IReadOnlyCollection接口(interface)并提供AsReadOnly()返回 ReadOnlyCollection 的方法(它又实现了 IReadOnlyColle
我花了好几个小时思考公开列表成员的主题。在与我类似的问题中,Jon Skeet 给出了很好的答案。请随时查看。 ReadOnlyCollection or IEnumerable for exposi
我是一名优秀的程序员,十分优秀!