确保存在 INNER JOIN 更重要。因为我们不想具体说明存储过程是如何实现的。但是,我们确实希望确保存储过程的预期结果始终按预期返回。
我的测试看起来像这样:
CREATE PROCEDURE [MyTests.SimpleTests].[test Returns_SimpleTable_Successfully]
AS
BEGIN
--Arrange
EXEC tSQLt.FakeTable @schemaname = 'dbo', @tablename = 'TableA';
EXEC tSQLt.FakeTable @schemaname = 'dbo', @tablename = 'TableB';
INSERT INTO TableA (Id, Column1) VALUES (1, 'Value1'),(2, 'Value2')
INSERT INTO TableB (Id, Column2) VALUES (1, 'Value3'),(3, 'Value4')
CREATE TABLE Expected
(
Column1 NVARCHAR(255),
Column2 NVARCHAR(255)
)
INSERT Expected (Column1, Column2)
VALUES (N'Value1', N'Value3');
--Act
CREATE TABLE Actual
(
Column1 NVARCHAR(255),
Column2 NVARCHAR(255)
)
INSERT Actual (Column1, Column2)
EXEC up_SimpleTest
--Assert
EXEC tSQLt.AssertEqualsTable 'Expected', 'Actual'
END;
被测试的存储过程如下所示:
CREATE PROC up_SimpleTest
AS
BEGIN
SELECT
A.Column1,
B.Column2
FROM TableA AS A
RIGHT JOIN TableB AS B
ON A.Id = B.Id;
END
这意味着如果存储过程更改为 LEFT、RIGHT 或 FULL 连接。测试将失败,因为不会返回预期的数据。但是,它确实允许存储过程更改为此并且仍然有效:
SELECT
A.Column1,
B.Column2
FROM TableA A, TableB B
WHERE A.Id = B.Id
这就是我们不应该也不能强制使用 INNER JOIN 的原因,因为关于如何实现查询还有许多其他有效方法。