我想测试一个验证是否已设置某些应用程序属性的方法。我正在尝试模拟获取设置的调用:
public interface IMyLogic{
string GetSetting(string key);
bool AreSettingsValid();
}
public class MyLogic: IMyLogic {
public string GetSetting(string key){
return (string) Properties.Settings.Default[key];
}
public bool AreSettingsValid(){
return GetSetting("Setting1") != null && GetSetting("Setting2") != null;
}
}
[TestClass]
public class MyLogicTest {
[TestMethod]
public void MyLogic_AreSettingsValidIsTrue_WhenValuesAreSet(){
var mockMyLogic = Mock<IMyLogic>();
mockMyLogic.Setup(m=>m.GetSetting(It.IsAny<string>())).Returns("something");
Assert(true, mockMyLogic.Object.AreSettingsValid());
}
}
这是行不通的。如何获得AreSettingsValid()
以触发对GetSetting
的模拟调用?
您需要在不同的类中使用 IMyLogic 来模拟它并伪造输出。例如:
class MyLogic
{
bool AreSettingsValid(IMySettings mySettings){
return mySettings.GetSetting("Setting1") != null &&
mySettings.GetSetting("Setting2") != null;
}
}
class MySettings: IMySettings {
string GetSetting(string key){
return (string) Properties.Settings.Default[key];
}
}
[TestClass]
class MyLogicTest
{
[TestMethod]
void MyLogic_AreSettingsValidIsTrue_WhenValuesAreSet(){
var mockMySettings = Mock<IMySettings>();
mockMySettings.Setup(m=>
m.GetSetting(It.IsAny<string())).Returns("something");
var myLogic = new MyLogic();
Assert(true, myLogic.AreSettingsValid(mySettings.Object));
}
}
您希望"模拟"被测类中使用的接口,而不是模拟本身。
在上面的代码中,我添加了一个表示设置的新类。现在我可以模拟类实现的接口来模拟 GetSettings(( 调用将执行的操作,即返回设置。我现在可以测试 MyLogic 类,而不必依赖 Properties.Settings.Default[key] 代码,因为它依赖于外部存在的东西,而您在进行单元测试时并不想依赖这些外部存在的东西。
希望有帮助吗?