亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 NUnit 對 DateTime 控制器進行單元測試

使用 NUnit 對 DateTime 控制器進行單元測試

C#
慕仙森 2023-09-24 10:54:04
我正在創建一個 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;        }    }}我正在嘗試對其進行單元測試并模擬日期和時間,但正在努力做到這一點(我已經查看了其他 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);         }    }}我的問題是 - 如何設置日期和時間,以便DateTime.Now在字符串中調用時,它不是當前的日期和時間?
查看完整描述

1 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

實現此目的的常用方法是在您正在測試的對象的構造函數中注入日期/時間提供程序。例如:


public interface IDateTimeProvider

{

    DateTime Now();

}

以及該接口的具體實現:


public class DateTimeProvider : IDateTimeProvider

{

    public DateTime Now() 

    {

        return Datetime.Now;

    }

}

您需要添加IDateTimeProvider到 DI 容器中,


就像是


services.AddSingleton<IDateTimeProvider, DateTimeProvider>(); 

但這取決于你如何設置它,你正在使用哪個框架等。


您的控制器將更改為如下所示:


[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;

    }

}

請注意將日期時間分配給變量。多次調用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); 

    }

}


查看完整回答
反對 回復 2023-09-24
  • 1 回答
  • 0 關注
  • 106 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號