来自 MAUI 的模拟 IPreferences 返回日期时间

问题描述 投票:0回答:1

我不太擅长 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值传递给该方法?

我正在尝试将模拟值传递给方法

c# mocking nunit
1个回答
0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.