c# 中的模拟依赖不起作用
Mocking dependency in c# not working
我可以模拟会话,但是我无法成功模拟会话配置 class。如果你在这个 post 的底部看到我的单元测试 class 调用我的 class 的连接方法。在调试连接方法中的设置对象时始终为空。你能告诉我可能有什么问题吗
我有一个 class 叫做 XYZ。它在其中声明了 FixSessionConfiguration 依赖项,称为
Class XYZ
{
[Dependency]
public FixSessionConfiguration Settings
{
get;
set;
}
public void Connect()
{
iFixSession = new FixSession(
Settings.SenderCompID,
Settings.TargetCompID,
Settings.Version,
Settings.SetResetSeqNumFlag);
}
}
我基本上需要为我的单元测试模拟 FixSessionConfiguration class。为此,我为会话配置创建了界面。这是代码
public class FixSessionConfiguration : SessionConfiguration,ISessionConfiguration
{
[ConfigurationProperty("senderSubID")]
public string SenderSubID
{
get { return (string)this["senderSubID"]; }
set { this["senderSubID"] = value; }
}
[ConfigurationProperty("senderLocationID")]
public string SenderLocationID
{
get { return (string)this["senderLocationID"]; }
set { this["senderLocationID"] = value; }
}
[ConfigurationProperty("targetSubID")]
public string TargetSubID
{
get { return (string)this["targetSubID"]; }
set { this["targetSubID"] = value; }
}
public new string SenderCompID { get; set; }
public new string TargetCompID { get; set; }
ProtocolVersion Version { get; set; }
public new bool SetResetSeqNumFlag { get; set; }
public new string Host { get; set; }
public new int Port { get; set; }
}
作为第三方二进制文件的一部分的 SessionConfiguration class。
public class SessionConfiguration : ConfigurationSection
{
[ConfigurationProperty("host", IsRequired = true)]
public string Host
{
get { return (string)this["host"]; }
set { this["host"] = value; }
}
[ConfigurationProperty("port", IsRequired = true)]
public int Port
{
get { return (int)this["port"]; }
set { this["port"] = value; }
}
[ConfigurationProperty("senderCompID", IsRequired = true)]
public string SenderCompID
{
get { return (string)this["senderCompID"]; }
set { this["senderCompID"] = value; }
}
[ConfigurationProperty("targetCompID", IsRequired = true)]
public string TargetCompID
{
get { return (string)this["targetCompID"]; }
set { this["targetCompID"] = value; }
}
[ConfigurationProperty("fixVersion", IsRequired = true)]
public ProtocolVersion Version
{
get
{
return (ProtocolVersion)this["fixVersion"];
}
set { this["fixVersion"] = value; }
}
[ConfigurationProperty("keepSequenceNumbersAfterLogout", IsRequired = true)]
public bool KeepSequenceNumbersAfterLogout
{
get { return (bool)this["keepSequenceNumbersAfterLogout"]; }
set { this["keepSequenceNumbersAfterLogout"] = value; }
}
}
我为 SessionConfiguration 创建的接口 class。
public interface ISessionConfiguration
{
string SenderCompID { get; set; }
string TargetCompID { get; set; }
ProtocolVersion Version { get; set; }
bool SetResetSeqNumFlag { get; set; }
string Host { get; set; }
int Port { get; set; }
}
我的单元测试class
Class UnitTest
{
private Mock<ISessionConfiguration> _mockSessionConfiguration;
[Fact]
public void Buy_QuoteAndDeal()
{
_mockSessionConfiguration = new Mock<ISessionConfiguration>();
_mockSessionConfiguration.Setup(x => x.SenderCompID).Returns("BESTINVESTLON");
_mockSessionConfiguration.Setup(x => x.TargetCompID).Returns("WINS");
_mockSessionConfiguration.Setup(x => x.Version).Returns(ProtocolVersion.FIX42);
_mockSessionConfiguration.Setup(x => x.SetResetSeqNumFlag).Returns(true);
_mockSessionConfiguration.Setup(x => x.Host).Returns("localhost");
_mockSessionConfiguration.Setup(x => x.Port).Returns(4500);
shareDealingEngine.Connect();
}
}
由于 class 属性 是 FixSessionConfiguration 而不是 ISessionConfiguration,您的模拟将无法工作。由于 FixSessionConfiguration 没有虚拟属性,你也不能模拟它,真的。
真的,您应该将 XYZ 属性 从 FixSessionConfiguration 更改为 ISessionConfiguration - 这将允许您模拟它 - 但您的测试仍然无法正常工作,因为您没有将模拟传递到您的 class 还。您需要执行以下操作:
var myClass = new XYZ();
myClass.Settings = _mockSessionConfiguration.Object;
// insert test code here
同样,理想情况下,设置将通过构造函数传入,但这与您面临的问题并没有真正的关系。
我可以模拟会话,但是我无法成功模拟会话配置 class。如果你在这个 post 的底部看到我的单元测试 class 调用我的 class 的连接方法。在调试连接方法中的设置对象时始终为空。你能告诉我可能有什么问题吗
我有一个 class 叫做 XYZ。它在其中声明了 FixSessionConfiguration 依赖项,称为
Class XYZ
{
[Dependency]
public FixSessionConfiguration Settings
{
get;
set;
}
public void Connect()
{
iFixSession = new FixSession(
Settings.SenderCompID,
Settings.TargetCompID,
Settings.Version,
Settings.SetResetSeqNumFlag);
}
}
我基本上需要为我的单元测试模拟 FixSessionConfiguration class。为此,我为会话配置创建了界面。这是代码
public class FixSessionConfiguration : SessionConfiguration,ISessionConfiguration
{
[ConfigurationProperty("senderSubID")]
public string SenderSubID
{
get { return (string)this["senderSubID"]; }
set { this["senderSubID"] = value; }
}
[ConfigurationProperty("senderLocationID")]
public string SenderLocationID
{
get { return (string)this["senderLocationID"]; }
set { this["senderLocationID"] = value; }
}
[ConfigurationProperty("targetSubID")]
public string TargetSubID
{
get { return (string)this["targetSubID"]; }
set { this["targetSubID"] = value; }
}
public new string SenderCompID { get; set; }
public new string TargetCompID { get; set; }
ProtocolVersion Version { get; set; }
public new bool SetResetSeqNumFlag { get; set; }
public new string Host { get; set; }
public new int Port { get; set; }
}
作为第三方二进制文件的一部分的 SessionConfiguration class。
public class SessionConfiguration : ConfigurationSection
{
[ConfigurationProperty("host", IsRequired = true)]
public string Host
{
get { return (string)this["host"]; }
set { this["host"] = value; }
}
[ConfigurationProperty("port", IsRequired = true)]
public int Port
{
get { return (int)this["port"]; }
set { this["port"] = value; }
}
[ConfigurationProperty("senderCompID", IsRequired = true)]
public string SenderCompID
{
get { return (string)this["senderCompID"]; }
set { this["senderCompID"] = value; }
}
[ConfigurationProperty("targetCompID", IsRequired = true)]
public string TargetCompID
{
get { return (string)this["targetCompID"]; }
set { this["targetCompID"] = value; }
}
[ConfigurationProperty("fixVersion", IsRequired = true)]
public ProtocolVersion Version
{
get
{
return (ProtocolVersion)this["fixVersion"];
}
set { this["fixVersion"] = value; }
}
[ConfigurationProperty("keepSequenceNumbersAfterLogout", IsRequired = true)]
public bool KeepSequenceNumbersAfterLogout
{
get { return (bool)this["keepSequenceNumbersAfterLogout"]; }
set { this["keepSequenceNumbersAfterLogout"] = value; }
}
}
我为 SessionConfiguration 创建的接口 class。
public interface ISessionConfiguration
{
string SenderCompID { get; set; }
string TargetCompID { get; set; }
ProtocolVersion Version { get; set; }
bool SetResetSeqNumFlag { get; set; }
string Host { get; set; }
int Port { get; set; }
}
我的单元测试class
Class UnitTest
{
private Mock<ISessionConfiguration> _mockSessionConfiguration;
[Fact]
public void Buy_QuoteAndDeal()
{
_mockSessionConfiguration = new Mock<ISessionConfiguration>();
_mockSessionConfiguration.Setup(x => x.SenderCompID).Returns("BESTINVESTLON");
_mockSessionConfiguration.Setup(x => x.TargetCompID).Returns("WINS");
_mockSessionConfiguration.Setup(x => x.Version).Returns(ProtocolVersion.FIX42);
_mockSessionConfiguration.Setup(x => x.SetResetSeqNumFlag).Returns(true);
_mockSessionConfiguration.Setup(x => x.Host).Returns("localhost");
_mockSessionConfiguration.Setup(x => x.Port).Returns(4500);
shareDealingEngine.Connect();
}
}
由于 class 属性 是 FixSessionConfiguration 而不是 ISessionConfiguration,您的模拟将无法工作。由于 FixSessionConfiguration 没有虚拟属性,你也不能模拟它,真的。
真的,您应该将 XYZ 属性 从 FixSessionConfiguration 更改为 ISessionConfiguration - 这将允许您模拟它 - 但您的测试仍然无法正常工作,因为您没有将模拟传递到您的 class 还。您需要执行以下操作:
var myClass = new XYZ();
myClass.Settings = _mockSessionConfiguration.Object;
// insert test code here
同样,理想情况下,设置将通过构造函数传入,但这与您面临的问题并没有真正的关系。