jue*_*ra7 3 c# nunit unit-testing moq asp.net-core
我正在创建一个 React / .NET Core 项目,其中一个页面显示当前日期和时间。我的控制器类如下:
namespace TestingReactDotNet.Controllers {
[Route ("api/[controller]")]
public class DayTodayController : Controller {
[HttpGet, Route ("GetDate")]
public string GetDate () {
var info = $"Today is {DateTime.Now.ToString("dddd, dd MMMM yyyy")} and the time is {DateTime.Now.ToString("hh:mm tt")}";
return info;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试对此进行单元测试并模拟日期和时间,但我正在努力做到这一点(我已经查看了其他 Stack Overflow 问题并在 Google 上搜索,但我仍然遇到问题)。本来想用的,Moq但是好像不行啊?
这是我到目前为止的测试内容:
namespace TestingReactDotNetTests
{
public class DayTodayTests
{
[Test]
public void ReturnsDateAndTime()
{
var controller = new DayTodayController();
string result = controller.GetDate();
string expected = "Today is Tuesday 27 August 2019 and the time is 10:00";
Assert.AreEqual(expected, result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 如何设置日期和时间,以便DateTime.Now在字符串中调用time 时,它不是当前日期和时间?
实现此目的的常用方法是在您正在测试的对象的构造函数中注入日期/时间提供程序。例如:
public interface IDateTimeProvider
{
DateTime Now();
}
Run Code Online (Sandbox Code Playgroud)
以及该接口的具体实现:
public class DateTimeProvider : IDateTimeProvider
{
public DateTime Now()
{
return Datetime.Now;
}
}
Run Code Online (Sandbox Code Playgroud)
你需要添加 IDateTimeProvider到 DI 容器中,
就像是
services.AddSingleton<IDateTimeProvider, DateTimeProvider>();
Run Code Online (Sandbox Code Playgroud)
但这取决于您如何设置它,您使用的是哪个框架等。
你的控制器会变成这样:
[Route ("api/[controller]")]
public class DayTodayController : Controller
{
private readonly IDateTimeProvider _dateTimeProvider;
public DayTodayController(IDateTimeProvider dateTimeProvider)
{
_dateTimeProvider = dateTimeProvider;
}
[HttpGet, Route ("GetDate")]
public string GetDate () {
var dateTime = _dateTimeProvider.Now();
var info = $"Today is {dateTime.ToString("dddd, dd MMMM yyyy")} and the time is {dateTime.ToString("hh:mm tt")}";
return info;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意将 DateTime 分配给变量。DateTime.Now多次调用将给出不同的值,因此您可能希望对一个实例进行操作以获得所需的行为。
现在您可以使用接口的非脆弱模拟实现进行测试:
public class DayTodayTests
{
[Test]
public void ReturnsDateAndTime()
{
//Arrange
var mockedDateTimeProvider = new Mock<IDateTimeProvider>();
mockedDateTimeProvider.Setup(dtp => dtp.Now()).Returns(new DateTime(2019, 8, 27, 10, 0, 0));
var controller = new DayTodayController(mockedDateTimeProvider.Object);
//Act
string result = controller.GetDate();
//Assert
string expected = "Today is Tuesday 27 August 2019 and the time is 10:00 AM";
Assert.AreEqual(expected, result);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |