我不太擅长 Mock。我正在为一种方法编写一个测试,该方法会在第二天+3 小时后重置该值。我正在使用 MAUI 的 IPreferences 接口。
public void ResetMileageIfNewDay()
{
var lastUpdate = preferences.Get(_lastUpdateKey, DateTime.MinValue);
var resetTime = DateTime.Now.Date.AddHours(3);
if (lastUpdate.Date < resetTime)
{
preferences.Set(_mileageKey, 0.0);
preferences.Set(_lastUpdateKey, DateTime.Now.Date);
preferences.Set(_lastSentMileageKey, 0.0);
_logger.LogInformation("Mileage reset due to new day at 3AM");
}
}
这是一个测试
[Test]
public void ResetMileageIfNewDay_ShouldReset_WhenLastUpdateBeforeResetTime()
{
var preferencesMock = new Mock<IPreferences>();
var lastUpdate = new DateTime(2024, 9, 18, 23, 0, 0);
preferencesMock
.Setup(p => p.Get(It.IsAny<string>(), DateTime.MinValue)) //Error here
.Returns(lastUpdate);
var service = new MileageService(preferencesMock.Object, default, default, default,default);
service.ResetMileageIfNewDay();
preferencesMock.Verify(p => p.Set("LastMileageUpdate", It.IsAny<string>(), It.IsAny<DateTime>()
.ToString("o")), Times.Once);
}
设置 DateTime.Minvalue 时出错
An expression tree cannot contain a call or invocation that uses optional arguments
我尝试执行 ToString,因此被添加,但对于我的方法来说不太正确
有什么问题吗?我怎样才能将lastUpdate值传递给该方法?
我正在尝试将模拟值传递给方法
在
Setup
方法中,您必须为要捕获的方法调用的所有参数定义条件。
正如您在文档中看到的那样:
public T Get<T> (string key, T defaultValue, string? sharedName = default);
有第三个参数。因此,正确的设置如下所示:
preferencesMock
.Setup(p => p.Get(It.IsAny<string>(), DateTime.MinValue, It.IsAny<string>()))
.Returns(lastUpdate);