我有以下代码:
public class Weather
{
public int Temperature { get; set; }
public string Description { get; set; }
}
public class WeatherProvider
{
public virtual Weather GetWeather()
{
var w = new Weather();
var hour = Hour;
if (hour < 5)
{
w.Description = "Sunny";
w.Temperature = 12;
}
else if (hour < 12)
{
w.Description = "Windy";
w.Temperature = 18;
}
else
{
w.Description = "Snow";
w.Temperature = 2;
}
return w;
}
public virtual int Hour
{
get { return DateTime.Now.Hour; }
}
}
var mockWeatherProvider = new Moq.Mock<WeatherProvider>(MockBehavior.Loose);
mockWeatherProvider.SetupGet(x => x.Hour).Returns(2);
var actualWeather = mockWeatherProvider.Object.GetWeather();//This line always returns null? WHY???
mockWeatherProvider.Verify(x=>x.GetWeather());
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么行var actualWeather = mockWeatherProvider.Object.GetWeather()返回null?我实际上想要调用真正的方法.我怎么能得到这个?
您尚未为该GetWeather()方法设置行为.基本上,你在这里做什么
var mockWeatherProvider = new Moq.Mock<WeatherProvider>(MockBehavior.Loose);
Run Code Online (Sandbox Code Playgroud)
正在创建一个看起来像WeatherProvider 的空对象.你必须告诉mockWeatherProvider什么每次要使用应该为你做的方法和属性.
编辑,因为我意识到你可能真正想要的东西
如果你试图模拟的只是你班级的一半,那么在这种特殊情况下你会以错误的方式进行实施.如果你想模拟,比如说,Hour你可以WeatherProvider通过某些TimeProvider实现提供该属性,或者WeatherProvider依赖于某些实现.
var mockedTimeProvider = new Moq.Mock<TimeProvider>(MockBehavior.Loose);
mockedTimeProvider.SetupGet(p => p.Hour).Returns(2);
var weatherProvider = new WeatherProvider(mockedTimeProvider.Object);
var actualWeather = weatherProvider.GetWeather();
Run Code Online (Sandbox Code Playgroud)
再次编辑
请尝试设置GetWeather()为不虚,然后用磕碰,而不是完整的嘲讽生成您的模拟.这应该保持方法不被默认返回者覆盖.虽然,这种方式会使你的设计有点尴尬,而不是像上面那样清楚.分离关注,等等.=)