c# - 即使输入与模拟输入值不匹配,最小起订量函数调用也始终返回值
问题描述
我正在模拟一个带有两个参数的函数调用。1. 输入不可变类对象 2. 输出参数。
示例代码:
Mock<ISample> mockSample = new Mock<ISample>();
SampleClass MyKey = new SampleClass() { prop1 = 1 };
SampleOutput output = new SampleOutput() { prop2 = 2 };
mockSample.setup(s => s.SampleMethod(It.is<SampleKey>(t => t.Equals(MyKey)),
out sampleOut))).Returns(true);
在实际代码执行中,如果密钥与模拟密钥相同,则此模拟函数返回正确的值,但是,我看到一个问题,即即使密钥不匹配,此模拟函数也返回相同的输出值。
有什么输入吗?
添加关键代码:
public class Key
{
public readonly DateTime prop1;
public readonly string prop2;
public Key(DateTime prop1, string prop2)
{
this.prop1 = prop1;
this.prop2 = prop2;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (ReferenceEquals(this, obj))
return true;
Key other = obj as Key;
return this.prop1 == other.prop1 && string.Compare(this.prop2, other.prop2);
}
public override int GetHashCode()
{
return prop1.GetHashCode() ^ prop2.GetHashCode();
}
}
解决方案
据我了解这个问题,您需要在两种不同的行为上设置模拟。请看一下示例测试:
[TestFixture]
public class MoqTests
{
[Test]
public void MoqOutParameter()
{
// Arrange
Mock<ISample> mockSample = new Mock<ISample>();
Key MyKey = new Key(DateTime.Today, "SomeValue");
SampleOutput sampleOut = new SampleOutput() { prop2 = 2 };
mockSample.Setup(s => s.SampleMethod(It.Is<Key>(t => t.Equals(MyKey)),
out sampleOut)).Returns(true);
// Act
SampleOutput out1;
var result1 = mockSample.Object.SampleMethod(new Key(DateTime.Today, "SomeValue"), out out1);
SampleOutput out2;
var result2 = mockSample.Object.SampleMethod(new Key(DateTime.MinValue, "AnotherValue"), out out2);
// Assert
Assert.True(result1);
Assert.AreEqual(out1, sampleOut);
Assert.False(result2);
Assert.Null(out2);
}
}
public class Key
{
public readonly DateTime prop1;
public readonly string prop2;
public Key(DateTime prop1, string prop2)
{
this.prop1 = prop1;
this.prop2 = prop2;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (ReferenceEquals(this, obj))
return true;
Key other = obj as Key;
// was forced to add `== 0` to make it compilable
return this.prop1 == other.prop1 && string.Compare(this.prop2, other.prop2) == 0;
}
public override int GetHashCode()
{
return prop1.GetHashCode() ^ prop2.GetHashCode();
}
}
public class SampleOutput
{
public int prop2 { get; set; }
}
public interface ISample
{
bool SampleMethod(Key key, out SampleOutput sampleOut);
}
UPD:我添加了我在本示例中使用的类Key
和SampleOutput
接口“ISample”,还添加了测试类。我正在使用 Nunit 启动测试,它一定没有意义。您可以根据需要使用任何单元测试框架。这个例子对我有用,测试是绿色的。请尝试一下并说出与您的环境不同的地方。另请注意,我已更改返回行Key.Equals
以使其可编译。
希望能帮助到你。
推荐阅读
- android - Android Fragment onClick 按钮打开具有相同活动的新 Fragment
- java - 无法使用无头模式 Selenium 定位元素
- excel - 如果用户尝试在受保护的单元格中写入,则自定义消息
- msbuild - 使 WIX 安装程序将文件放置在 AppData 中
- c# - c# 通过对象拆箱
- azure - 如何在 azure 中构建 200 个本地数据库?
- php - 如何在 MySQL 中使用带有连接的 CodeIgniter 使用 CASE
- c# - 我如何让用户将字符串添加到数组中,而其中已经存在字符串?(Windows 窗体)
- jquery - 添加、更新和删除 jQuery 代码不起作用
- javascript - 为什么不能“OR Throw”排队?