我很难用Mock在Python中进行非平凡的单元测试。我不想将生产数据库用于我的测试套件,并且想要创建一个仅测试数据库。
我想说我想用这3个包含这些数据的表创建一个模拟数据库:
FRUIT
id Name
1 Apple
2 Pear
3 Orange
COLOR
id Name
1 Red
2 Yellow
3 Orange
FRUIT_COLOR
id fruit_id color_id
1 1 1
2 1 2
3 2 2
4 3 3
现在让我说我有以下功能:
def assess_fruit(self):
query = """
SELECT
f.name AS FRUIT,
c.name AS COLOR
FROM fruit_color AS fc
JOIN fruit AS f ON f.id = fc.fruit_id
JOIN color AS c ON c.id = fc.color_id
WHERE color.name = 'Red';
"""
cursor.execute(self._query)
results = cursor.fetchall()
return results
如何使用Mock创建此数据库并测试结果应该类似于这个元组列表?
[(Apple, Red), (Apple, Yellow)]
提前谢谢。
答案 0 :(得分:1)
Python单元测试setUp
类有两个方法tearDown
和CREATE
,它们在您的测试用例开始和结束时调用。您可以将INSERT
表和from unittest import TestCase
class TestMyData(TestCase):
def setUp(self):
query = """
CREATE TABLE FRUIT (
id INT,
Name VARCHAR(255)
);
INSERT INTO FRUIT (id, Name)
VALUES (1, 'Apple'),
(2, 'Pear'),
(3, 'Orange');
"""
cursor.execute(query)
# Add CREATE & INSERT table statements for COLOR and FRUIT_COLOR tables
def assess_fruit(self):
query = """
SELECT
f.name AS FRUIT,
c.name AS COLOR
FROM fruit_color AS fc
JOIN fruit AS f ON f.id = fc.fruit_id
JOIN color AS c ON c.id = fc.color_id
WHERE color.name = 'Red';
"""
cursor.execute(query)
results = cursor.fetchall()
return results
def tearDown(self):
query = """
DROP TABLE FRUIT;
DROP TABLE COLOR;
DROP TABLE FRUIT_COLOR;
"""
cursor.execute(query)
数据的代码添加到这两种方法的表中。见下面的例子:
#include <iostream>
#include <conio.h>
#include <string>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include <sstream>
#include <fstream>
#include "GameMaster.h"
using namespace std;
int main(int argc, char** argv) {
string vBefehlH = "help"; //vergleichsBefehlX
string vBefehlR = "rdm";
string vBefehlI = "items";
string eBefehl; //eingegebener Befehl
char Befehl;
cout << "------Willkommen GameMaster------" << endl <<endl;
cout << "Geben sie *help* ein, um eine Liste der verf\201gbaren Befehle auszugeben." << endl;
while(1)
{
cin >> Befehl; //wartet auf die eingabe eines Befehls
if(eBefehl == vBefehlH)
{
Befehl = 'h';
}
if(eBefehl == vBefehlR)
{
Befehl = 'r';
}
switch(Befehl)
{
case 'h': //gibt die Hilfe aus
{
cout << "help -Gibt eine Liste aller verf\201gbaren Befehle im aktuellen Bereich aus." << endl;
cout << "rdm -Erstellt einen neuen Charakter." << endl;
cout << "items -Geht in den Item Bereich." << endl;
break;
}
case 'r':
{
string Name;
string Geschlecht;
string Rasse;
string Beruf;
string Hautfarbe;
string Haarfarbe;
string Augenfarbe;
cout << "Name: ";
cin >> Name; //cin muss aus irgendeinem Grund doppelt sein. Sonst wird es übersprungen.
cin >> Name;
cout << "Geschlecht: ";
cin >> Geschlecht;
cout << "Rasse: ";
cin >> Rasse;
cout << "Beruf: ";
cin >> Beruf;
cout << "Hautfarbe: ";
cin >> Hautfarbe;
cout << "Haarfarbe: ";
cin >> Haarfarbe;
cout << "Augenfarbe: ";
cin >> Augenfarbe;
Charakter Charakter1(Name, Geschlecht, Rasse, Beruf, Hautfarbe, Haarfarbe, Augenfarbe);
Charakter1.Werte();
Charakter1.grWerte();
Charakter1.spWerte();
Charakter1.SchreibCharakter();
cout << endl << "Der Charakter wurde erfolgreich erstellt und befindet sich in *rdmCharakter.txt*" << endl;
system ("pause");
break;
}
}
}
return 0;
如果您想学习如何实际模拟对数据库的调用,那么您可以查看我不久前写的this blog post。