Python Mock Unittest断言Mysql结果集

时间:2017-06-05 20:22:03

标签: python mysql unit-testing mocking

我很难用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)]

提前谢谢。

1 个答案:

答案 0 :(得分:1)

Python单元测试setUp类有两个方法tearDownCREATE,它们在您的测试用例开始和结束时调用。您可以将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