【发布时间】:2015-10-12 13:43:32
【问题描述】:
我对最小起订量非常陌生,有一个我无法解决的问题。我正在测试以下代码(我正在测试第一个 - ValidateInputBankFile):
#region Constructor
private readonly IErrorRepository _errorRepository;
private readonly IFileSystem _fileSystem;
public IP_BankInfoDeserializer(IErrorRepository errorRepository, IFileSystem fileSystem)
{
_errorRepository = errorRepository;
_fileSystem = fileSystem;
}
#endregion
public IP_BankInfo ValidateInputBankFile(string sPath, App.BankType bankType)
{
if (!_fileSystem.FileExists((sPath)))
return null;
//first retrieve representative bank info
var tmpInfo = DeserializeBankInfo(bankType);
if (tmpInfo == null)
return null;//Does not exist
return tmpInfo;
}
public IP_BankInfo DeserializeBankInfo(App.BankType bankType)
{
if (!IsFileCorrect(bankType))
return null;
IP_BankInfo info = new IP_BankInfo();
using (var stream = new StreamReader(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + sFolder + Path.DirectorySeparatorChar +
bankType.ToString() + ".xml"))
{
XmlSerializer serializer = new XmlSerializer(typeof(IP_BankInfo));
try
{
info = serializer.Deserialize(stream) as IP_BankInfo;
}
catch (Exception ex)
{
info = null;
}
}
return info;
}
这是我的测试方法:
[TestMethod]
public void ValidateInputBank_ExistingPath_ExistingBank()
{
Mock<IFileSystem> fileSystem = new Mock<IFileSystem>();
fileSystem.Setup(n => n.FileExists(null)).Returns(true);
Mock<IP_BankInfoDeserializer> mocSerializer = new Mock<IP_BankInfoDeserializer>();
mocSerializer.Setup(n => n.DeserializeBankInfo(App.BankType.UniCredit)).Returns(new Models.IP_BankInfo());
var result = mocSerializer.Object.ValidateInputBankFile(null, App.BankType.UniCredit);
//Assert.AreEqual(serializer.Object.ValidateInputBankFile(null, App.BankType.UniCredit), new Models.IP_BankInfo());
}
我要做的是避免调用 DeserializeBankInfo,返回新的IP_BankInfo,以便我可以在最后的断言阶段检查它。
问题是我的 var 结果 总是返回 null。我不明白我做错了什么?
以下代码 mocSerializer.Setup(n => n.DeserializeBankInfo(App.BankType.UniCredit)).Returns(()=>null); 也失败了,但我传递了正确的参数。
【问题讨论】:
-
您的测试中似乎只有一个模拟版本的类 - 您应该构造一个要测试的 实际类 的实例,传入模拟对象该类需要的任何内容,因此当它在测试期间调用这些方法时,您可以完全控制传递回被测类的信息。
-
我可以创建
IP_BankInfoDeserializer的实例,但是当我调用ValidateInputBankFile时,我不希望它调用DeserializeBank,因为它会调用XMLSerializer,而是直接返回我想要的。问题是我不知道如何绕过那个调用 -
这时你可能需要引入另一个层,并传入一个负责与底层存储对话的接口给这个类。目前,您正在测试的单元(类)负责访问
DeserializeBankInfo中的磁盘,所以如果您正在测试这个单元,您将测试磁盘访问作为它的一部分。如果你想让它分开,你必须把它分成自己的单元。单元测试并不一定意味着测试单个函数——一个单元通常是整个类。 -
在一个完全不相关的注释上——你可能想看看
Path.Combine——会稍微清理一下流阅读器的结构。
标签: c# unit-testing moq