【发布时间】:2014-06-26 00:20:57
【问题描述】:
所以,我有自己的 Luhn 算法实现,我正在使用正则表达式来验证用户的输入。
我继续进行单元测试,但我发现自己遇到了这个问题:
Mock<Regex> regexMock = new Mock<Regex>();
regexMock.Setup(r => r.IsMatch(It.IsAny<string>())).Returns(true);
注意:我正在使用 Moq 框架进行模拟
但不知何故,最后一行代码抛出异常
非虚拟(在 VB 中可覆盖)成员的设置无效:r => r.IsMatch(It.IsAny
())
我想知道我有什么替代方案来解决我的模拟问题,或者可以采取一些解决方法。
提前致谢!
编辑:
好的,所以我的测试看起来像这样:
Mock<Regex> regexMock = new Mock<Regex>();
regexMock.Setup(r => r.IsMatch(It.IsAny<string>())).Returns(true);
Mock<IRegexBuilder> builderMock = new Mock<IRegexBuilder>();
builderMock.Setup(m => m.Build()).Returns(regexMock.Object);
LuhnAlgorithm luhn = new LuhnAlgorithm(builderMock.Object);
string input = "7992739871";
ushort expected = 3;
object output = luhn.GenerateChecksum(input);
Assert.IsInstanceOfType(output, typeof(ushort));
Assert.AreEqual(expected, (ushort)output);
我有这个IRegexBuilder,这是我为帮助创建正则表达式而制作的另一个类。重要的是,最终的 Regex 对象是通过调用 IRegexBuilder.Build() 方法生成的。
现在,我可以模拟该方法并返回一个固定的正则表达式,例如:
builderMock.Setup(m => m.Build()).Returns(new Regex("\d+"));
但我不想在测试中定义我的验证。
伙计们,我希望我的验证(不管它是如何进行的)不会影响我的测试,我想模拟输入匹配以返回真或假,而与验证的方式无关。如果我在测试方法中创建自己的正则表达式,那么以后每当我更改验证逻辑时,我都必须更改测试。
【问题讨论】:
-
为什么你要模拟这个?你想测试什么?如果你能展示你的代码的形状和你正在尝试编写的测试,那将会很有帮助。
-
我同意 Jon 的观点......我想不出模拟正则表达式的场景。
-
又一次滥用嘲讽。你在测试.NET 框架本身吗?您可以轻松地将两种不同的数据传递到您实际可测试的方法中,并且需要一项测试通过,一项测试失败。像对待盐一样对待嘲笑 - 没有或太多,你吃的饭很糟糕
-
好的,我用更多细节编辑了我的问题
标签: c# visual-studio oop unit-testing mocking