C# 为什么指定倍数时NSubstitute只返回最后一个值
我试图在DAO类中模拟IDbConnection,但收到以下错误: 字符串长度均为5。字符串在索引0处不同。 预期:“11111” 但是是:“22222” 这是我的密码: 测试中的课程C# 为什么指定倍数时NSubstitute只返回最后一个值,c#,mocking,nsubstitute,C#,Mocking,Nsubstitute,我试图在DAO类中模拟IDbConnection,但收到以下错误: 字符串长度均为5。字符串在索引0处不同。 预期:“11111” 但是是:“22222” 这是我的密码: 测试中的课程 内部类ImportAcquisitionDataDAO:IImportAcquisitionDataDAO { 私有静态记录器log=LogManager.GetCurrentClassLogger(); 专用只读IDB连接; 内部ImportAcquisitionDataDAO(IDbConnection) {
内部类ImportAcquisitionDataDAO:IImportAcquisitionDataDAO
{
私有静态记录器log=LogManager.GetCurrentClassLogger();
专用只读IDB连接;
内部ImportAcquisitionDataDAO(IDbConnection)
{
这个连接=连接;
}
内部列表GetDefinitions()
{
Debug(“从数据库获取定义”);
变量定义=新列表();
使用(连接)
{
connection.Open();
log.Trace(“数据库连接已打开”);
IDbCommand=connection.CreateCommand();
command.CommandText=@“选择*
“来自映射”;
IDataReader reader=command.ExecuteReader();
Trace(“执行的命令:\n{0}”,Command.CommandText);
定义=GetMeterEntries(读卡器);
}
Debug(“获得{0}个定义。”,definitions.Count);
返回定义;
}
私有列表GetMeterEntries(IDataReader阅读器)
{
Trace(“解析来自响应的定义”);
var result=新列表();
while(reader.Read())
{
变量定义=新定义条目(
reader.GetString(0),
reader.GetString(1),
reader.GetString(2),
reader.IsDBNull(3)?null:reader.GetString(3),
reader.IsDBNull(4)?null:reader.GetString(4),
reader.IsDBNull(5)?null:reader.GetString(5),
reader.IsDBNull(6)?null:reader.GetString(6)
);
log.Trace(definition.ToString());
结果.增加(定义);
}
返回结果;
}
}
公共类定义条目
{
公共字符串MeterSN{get;private set;}
公共字符串匹配{get;private set;}
公共字符串IpAddress{get;private set;}
公共字符串SIM{get;private set;}
公共字符串ModulID{get;private set;}
公共字符串SIMUser{get;private set;}
公共字符串SIMPassword{get;private set;}
公共定义条目(字符串meterSN、字符串matnr、字符串ipAddress、字符串sim、字符串modulId、字符串simUser、字符串simPassword)
{
MeterSN=MeterSN;
MATNR=MATNR;
IP地址=IP地址;
SIM=SIM;
ModulID=ModulID;
SIMUser=SIMUser;
SIMPassword=SIMPassword;
}
}
测试班
[TestFixture]
公共类ImportAcquisitionDataDAOTests
{
私有连接;
私有idbcomck命令;
私人IDataReader mockReader;
私人进口收购数据道;
[设置]
公共作废设置()
{
mockConnection=替换.For();
mockCommand=replacement.For();
mockReader=Substitute.For();
dao=新的ImportAcquisitionDataDAO(mockConnection);
mockConnection.CreateCommand()返回(mockCommand);
mockCommand.ExecuteReader()返回(mockReader);
}
[测试]
公共void TestGetDefinitions()
{
//嘲弄
var databaseDefinitionFirst=新定义条目(“11111”、“AS3000-5/100-400-P”、“10.42.42.26”、“SIM-001”、“12345lkj”、“阿里巴巴”、“阿布拉卡达布拉”);
var databaseDefinitionSecond=新定义条目(“22222”、“AS3000-5/100-400-Q”、“10.42.42.158”、null、null、null、null);
mockReader.Read()返回(true、true、false);
GetString(Arg.Is(0)).Returns(databaseDefinitionFirst.MeterSN,databaseDefinitionSecond.MeterSN);
GetString(Arg.Is(1)).Returns(databaseDefinitionFirst.MATNR,databaseDefinitionSecond.MATNR);
GetString(Arg.Is(2)).Returns(databaseDefinitionFirst.IpAddress,databaseDefinitionSecond.IpAddress);
IsDBNull(参数为(3)).Returns(false,true);
GetString(Arg.Is(3)).Returns(databaseDefinitionFirst.SIM);
IsDBNull(参数为(4)).Returns(false,true);
GetString(Arg.Is(4)).Returns(databaseDefinitionFirst.moduleId);
IsDBNull(参数为(5)).Returns(false,true);
GetString(Arg.Is(5)).Returns(databaseDefinitionFirst.SIMUser);
IsDBNull(参数为(6)).Returns(false,true);
GetString(Arg.Is(6)).Returns(databaseDefinitionFirst.SIMPassword);
//使用
List tested=dao.GetDefinitions();
//核实
Assert.AreEqual(2,tested.Count);
AssertDefinitionEntry(databaseDefinitionFirst,tested.First());
AssertDefinitionEntry(databaseDefinitionSecond,tested.Last());
}
私有无效资产定义项(预期定义项,测试定义项)
{
Assert.AreEqual(expected.MeterSN,tested.MeterSN);
Assert.AreEqual(expected.MATNR,tested.MATNR);
Assert.AreEqual(预期的.IpAddress,测试的.IpAddress);
Assert.AreEqual(expected.SIM,tested.SIM);
Assert.AreEqual(expected.moduleId,tested.moduleId);
Assert.AreEqual(expected.SIMUser,tested.SIMUser);
Assert.AreEqual(预期为.SIMPassword,测试为.SIMPassword);
}
}
这是执行第一个断言之前的调试屏幕:
除MeterSN字段外,所有设置都与预期相同,这两个条目都是相同的。但我无法找出为什么这是一个相当微妙的问题 简短答复: Move
mockReader.GetString(参数为(0)).Returns(databaseDefinitionFirst.MeterSN,databaseDefinitionSecond.MeterSN)
是最后一个存根调用(就在mockReader.GetString(Arg.Is(6))
下面)
internal class ImportAcquisitionDataDAO : IImportAcquisitionDataDAO
{
private static Logger log = LogManager.GetCurrentClassLogger();
private readonly IDbConnection connection;
internal ImportAcquisitionDataDAO(IDbConnection connection)
{
this.connection = connection;
}
internal List<DefinitionEntry> GetDefinitions()
{
log.Debug("Getting definitions from database.");
var definitions = new List<DefinitionEntry>();
using (connection)
{
connection.Open();
log.Trace("Database connection opened");
IDbCommand command = connection.CreateCommand();
command.CommandText = @"SELECT *
FROM MAPPING";
IDataReader reader = command.ExecuteReader();
log.Trace("Command executed:\n{0}", command.CommandText);
definitions = GetMeterEntries(reader);
}
log.Debug("Obtained {0} definitions.", definitions.Count);
return definitions;
}
private List<DefinitionEntry> GetMeterEntries(IDataReader reader)
{
log.Trace("Parsing definitions from response");
var result = new List<DefinitionEntry>();
while (reader.Read())
{
var definition = new DefinitionEntry(
reader.GetString(0),
reader.GetString(1),
reader.GetString(2),
reader.IsDBNull(3) ? null : reader.GetString(3),
reader.IsDBNull(4) ? null : reader.GetString(4),
reader.IsDBNull(5) ? null : reader.GetString(5),
reader.IsDBNull(6) ? null : reader.GetString(6)
);
log.Trace(definition.ToString());
result.Add(definition);
}
return result;
}
}
public class DefinitionEntry
{
public string MeterSN { get; private set; }
public string MATNR { get; private set; }
public string IpAddress { get; private set; }
public string SIM { get; private set; }
public string ModulID { get; private set; }
public string SIMUser { get; private set; }
public string SIMPassword { get; private set; }
public DefinitionEntry(string meterSN, string matnr, string ipAddress, string sim, string modulId, string simUser, string simPassword)
{
MeterSN = meterSN;
MATNR = matnr;
IpAddress = ipAddress;
SIM = sim;
ModulID = modulId;
SIMUser = simUser;
SIMPassword = simPassword;
}
}
[TestFixture]
public class ImportAcquisitionDataDAOTests
{
private IDbConnection mockConnection;
private IDbCommand mockCommand;
private IDataReader mockReader;
private ImportAcquisitionDataDAO dao;
[SetUp]
public void SetUp()
{
mockConnection = Substitute.For<IDbConnection>();
mockCommand = Substitute.For<IDbCommand>();
mockReader = Substitute.For<IDataReader>();
dao = new ImportAcquisitionDataDAO(mockConnection);
mockConnection.CreateCommand().Returns(mockCommand);
mockCommand.ExecuteReader().Returns(mockReader);
}
[Test]
public void TestGetDefinitions()
{
// mock
var databaseDefinitionFirst = new DefinitionEntry("11111", "AS3000-5/100-400-P", "10.42.42.26", "SIM-001", "12345lkj", "alibaba", "abrakadabra");
var databaseDefinitionSecond = new DefinitionEntry("22222", "AS3000-5/100-400-Q", "10.42.42.158", null, null, null, null);
mockReader.Read().Returns(true, true, false);
mockReader.GetString(Arg.Is<int>(0)).Returns(databaseDefinitionFirst.MeterSN, databaseDefinitionSecond.MeterSN);
mockReader.GetString(Arg.Is<int>(1)).Returns(databaseDefinitionFirst.MATNR, databaseDefinitionSecond.MATNR);
mockReader.GetString(Arg.Is<int>(2)).Returns(databaseDefinitionFirst.IpAddress, databaseDefinitionSecond.IpAddress);
mockReader.IsDBNull(Arg.Is<int>(3)).Returns(false, true);
mockReader.GetString(Arg.Is<int>(3)).Returns(databaseDefinitionFirst.SIM);
mockReader.IsDBNull(Arg.Is<int>(4)).Returns(false, true);
mockReader.GetString(Arg.Is<int>(4)).Returns(databaseDefinitionFirst.ModulID);
mockReader.IsDBNull(Arg.Is<int>(5)).Returns(false, true);
mockReader.GetString(Arg.Is<int>(5)).Returns(databaseDefinitionFirst.SIMUser);
mockReader.IsDBNull(Arg.Is<int>(6)).Returns(false, true);
mockReader.GetString(Arg.Is<int>(6)).Returns(databaseDefinitionFirst.SIMPassword);
// use
List<DefinitionEntry> tested = dao.GetDefinitions();
// verify
Assert.AreEqual(2, tested.Count);
AssertDefinitionEntry(databaseDefinitionFirst, tested.First());
AssertDefinitionEntry(databaseDefinitionSecond, tested.Last());
}
private void AssertDefinitionEntry(DefinitionEntry expected, DefinitionEntry tested)
{
Assert.AreEqual(expected.MeterSN, tested.MeterSN);
Assert.AreEqual(expected.MATNR, tested.MATNR);
Assert.AreEqual(expected.IpAddress, tested.IpAddress);
Assert.AreEqual(expected.SIM, tested.SIM);
Assert.AreEqual(expected.ModulID, tested.ModulID);
Assert.AreEqual(expected.SIMUser, tested.SIMUser);
Assert.AreEqual(expected.SIMPassword, tested.SIMPassword);
}
}
DataTable dt = new DataTable();
dt.Columns.AddRange(
new [] {
new DataColumn("a", typeof(string)),
new DataColumn("b", typeof(string)),
new DataColumn("c", typeof(string)),
new DataColumn("d", typeof(string)),
new DataColumn("e", typeof(string)),
new DataColumn("f", typeof(string)),
new DataColumn("g", typeof(string))
});
dt.Rows.Add("11111", "AS3000-5/100-400-P", "10.42.42.26", "SIM-001", "12345lkj", "alibaba", "abrakadabra");
dt.Rows.Add("22222", "AS3000-5/100-400-Q", "10.42.42.158", null, null, null, null);
mockReader = new DataTableReader(dt);