У меня есть простое приложение, которое читает и записывает результаты в базу данных MySQL, используя javascript и python / flask.Я хочу знать, как наилучшим образом изолировать различные блоки приложения для тестирования.
JavaScript:
Как бы я это высмеял итакже потребуются ли для него специальные тесты в наборе тестов только для JavaScript?
$scope.create_score = function () {
console.log("logged");
var scoreData = new scoreObj($scope.match_ID,$scope.Home_Score, $scope.Away_Score);
if ($scope.Home_Score >= 0 && $scope.Away_Score >= 0) {
$http(
{
method: 'POST',
url: "/api/v1/scores",
data: scoreData
}
).then(function successCallback(response) {
alert("Success");
}, function errorCallback(response) {
alert("Sorry, there was a problem!");
}
)
} else {
alert("Sorry, score can not be negative!");
}
};
Python:
Это основные функции, которые мне нужно проверить.
def execute_query_json(cursor, qry, cnx):
print("Executing JSON query...")
cursor.execute(qry, (request.json['Match_ID'],
request.json['Home_Score'],
request.json['Away_Score'],)
)
cnx.commit()
def add_score():
cnx = conn_db()
cursor = cnx.cursor()
print("Updating score")
execute_query_json(cursor, "INSERT INTO scores (Match_ID, Home_Score, Away_Score) VALUES (%s,%s,%s)", cnx)
return "ok"
Тесты:
Как бы я консолидировалразличные методы насмешки (менеджеры контекста / декораторы), которые будут использоваться в разных тестах?
Каковы варианты использования для различных методов насмешки или они взаимозаменяемы?
Как бы я создал поддельные данные json / ожидаемого счета для использования с различными фиктивными объектами?
from unittest.mock import patch, MagicMock
from unittest.mock import Mock
import unittest
from source.src import scores
from source.src.scores import add_score
import source
@patch('source.src.scores.request')
def test_add_scores(self):
columns = ["Match_ID", "Home_Score", "Away_Score"]
values = [1, 1, 1]
expected_score = {columns[i]: values[i] for i in range(len(columns))}
json = {columns[i]:values[i] for i in range(len(columns)-1)}
with patch('source.src.scores.mysql.connector') as patch_connector:
self.assertIs(scores.mysql.connector, patch_connector)
cursor = Mock()
cursor.fetchone.return_value = values
cursor.column_names = columns
connect = Mock()
connect.cursor.return_value = cursor
patch_connector.connect.return_value = connect
new_score = add_score()
assert patch_connector.connect.called
assert connect.cursor.called
assert connect.commit.called
assert cursor.fetchone.called
self.assertEqual(cursor.execute.call_count, 2)
self.assertDictEqual(expected_score, new_score)
if __name__ == '__main__':
test_add_scores()
Большое спасибо, ребята, действительно непостижимо, как тестироватьэто.