我有一个多次使用 GETUTCDATE() 函数的存储过程。这是一个非常具体的业务线,所以在这里展示它可能没有多大意义。话虽如此,知道 sproc 只会在当年被调用可能会有所帮助。这是一个人为的例子,它没有显示我正在做的事情的复杂性,但应该有助于说明我在说什么:
CREATE PROCEDURE dbo.GenerateRequestListForCurrentYear AS BEGIN
SELECT RequestId, StartDate, EndDate FROM Requests
WHERE YEAR(EndDate) = YEAR(GETUTCDATE());
END;
我的测试如下所示:
CREATE PROCEDURE testClass.[test Requests are generated for the current year] AS BEGIN
-- arrange
EXEC tSQLt.FakeTable 'dbo.Requests';
INSERT INTO dbo.Requests (RequestId, StartDate, EndDate) VALUES
(1, '2/1/14', '2/10/14'), (2, '2/1/13', '2/10/13');
SELECT TOP (0) * INTO #Expected FROM dbo.Requests;
SELECT TOP (0) * INTO #Actual FROM dbo.Requests;
INSERT INTO #Expected VALUES
(1, '2/1/14', '2/10/14');
-- act
INSERT INTO #Actual
EXEC dbo.GenerateRequestListForCurrentYear;
-- assert
EXEC tSQLt.AssertEqualsTable #Expected, #Actual;
END;
我看到几个选项:
- 将日期/时间作为参数传入(如果为 NULL,则将值设置为 GETUTCDATE())
- 用我自己的函数替换对 GETUTCDATE() 的调用,以返回我可以使用 tSQLt 伪造的日期/时间
- ?
这两个似乎都是测试所需的选项,看起来有点臭;关于如何从主应用程序调用这个存储过程,永远不需要参数化它。
由于它与 SQL 中具有自己依赖关系的内置函数的依赖关系有关,有没有办法在 tSQLt 测试中伪造这些调用?有没有更好的方法来伪造对 GETUTCDATE() 的调用以返回我在使用 tSQLt 的测试中指定的日期,或者这些是我唯一的选择吗?