J'ai écrit une procédure stockée, puis un script de test unitaire.
Mais l'un des tests échoue alors qu'il aurait dû réussir, et en fait il a vraiment réussi, mais mon script continue de croire qu'il a échoué.

J'ai supprimé une partie du script, et j'ai pu reproduire le problème en executant le code ci-dessous.
Où est-ce que j'ai pu me tromper ? Il y a forcément une étourderie quelque part.

Merci.

================
Ce code crée une table et une procédure stockée dans la base de données tempdb, puis lance le test dessus, et échoue.

La ligne qui pose problème semble être (select count(*) from client where id_client=@id AND @designation=designation AND @code_client=code_client), vers la fin du test. Cette requête retourne 0, mais je m'attendais à ce qu'elle retourne 1.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
use tempdb
go
drop table client
drop proc creer_client
go
 
CREATE TABLE [client] (
    [id_client] [bigint] IDENTITY (1, 1) NOT NULL ,
    [code_client] [varchar] (20) COLLATE French_CI_AS NOT NULL ,
    [designation] [varchar] (50) COLLATE French_CI_AS NULL ,
    [sceau] [timestamp] NOT NULL ,
    CONSTRAINT [PK_client] PRIMARY KEY  
    (
        [id_client]
    )  ON [PRIMARY] 
) ON [PRIMARY]
GO
 
/* insérer des valeurs bâteau dans la table 'client' */
insert client (code_client, designation) values ('orig', 'orig')
go
 
 
CREATE PROCEDURE [creer_client] 
    @code_client varchar(20), 
    @designation varchar(50),
    @id bigint OUTPUT, 
    @message varchar(80) OUTPUT
AS
 
/* toutes vérification finies */
insert client (code_client, designation) values (@code_client, @designation)
/* dernier client inséré */
set @id = scope_identity()
 
set @message='Le client a été créé dans la bdd.'
 
GO
 
/***************************************************
SCRIPT DE TEST DE LA PROCEDURE STOCKEE 
CREER_CLIENT
****************************************************/
 
 
SET NOCOUNT ON /* ne pas afficher à chaque fois le nombre de lignes affectées */
 
/* valeurs qui seront assignées lors de chaque test */
DECLARE @RC int
DECLARE @code_client varchar(20)
DECLARE @designation varchar(50)
DECLARE @message varchar(80)
 
declare @code_client_temp varchar(20)
declare @designation_temp varchar(50)
 
/* client nouvellement créé */
DECLARE @id BIGINT
 
DECLARE @rc_attendu int /* code retour attendu après chaque test */
 
 
/***************************************************************
TEST DE LA PROCEDURE STOCKEE CREER_CLIENT
*/
 
DECLARE @test char(8)
DECLARE @i int
set @i = 2
 
set @test='test 1.' +convert(varchar,@i)
print ''
print @test + ' ********** '
 
-- Définir les valeurs de paramètre
set @code_client='codecli '+@test
set @designation=null
set @rc_attendu=0
 
 
/* executer la procédure stockée */
EXEC @RC = creer_client @code_client, @designation, 
        @id OUTPUT , @message OUTPUT     
 
/* comparer les résultats */
IF     @RC = @rc_attendu BEGIN
    IF @RC = 0 AND (select count(*) from client where id_client=@id AND @designation=designation AND @code_client=code_client) = 1 BEGIN
        print 'test réussi : client créé'
    END ELSE IF @RC > 0 AND @id = -1 BEGIN
        print 'test réussi : client non créé'
    END ELSE BEGIN
        goto erreur
    END
END    ELSE 
BEGIN
    BEGIN
erreur:
        print 'résultat inattendu: '
        print 'code retour:' +convert(varchar,@RC)+ ' (attendu:'+ convert(varchar,@rc_attendu)+ '), id:' +convert(varchar,@id) 
        print @message
        select @code_client_temp=code_client, @designation_temp=designation from client where id_client=@id
        print '['+@code_client_temp+'] vs ['+ @code_client + ']'
        print '['+isnull(@designation_temp,'<null>') +'] vs ['+ isnull(@designation,'<null>')+']'
        select * from client
    END
END