Будьте осторожны с использованием класса SqlDependency - он имеет проблемы с утечками памяти. Hovewer, вы можете использовать реализацию с открытым исходным кодом класса SqlDependency - SqlDependencyEx . Он использует триггер базы данных и собственное уведомление Service Broker для получения событий о изменениях таблицы. Это пример использования:
int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME))
{
sqlDependency.TableChanged += (o, e) => changesReceived++;
sqlDependency.Start();
// Make table changes.
MakeTableInsertDeleteChanges(changesCount);
// Wait a little bit to receive all changes.
Thread.Sleep(1000);
}
Assert.AreEqual(changesCount, changesReceived);
С SqlDependecyEx вы можете отслеживать только UPDATE, избегая DELETE и INSERT. Надеюсь, это поможет.
Я приведу два примера, которые, как мы надеемся, могут дать вам что-то, с чего можно начать издеваться над NetworkSession
.
Во-первых, вы можете добавить дополнительные свойства к вашему фиктивному классу, которые поддерживают вставку значений для тестирования различных случаев. Я покажу ситуацию с ошибками и пока вернусь.
enum MyError: Swift.Error {
case failed
}
final class NetworkSessionManagerMock : NetworkSession {
var myError: MyError?
var dataResponse: Any? // This should hopefully be typed to something
func request(
_ endpoint: Endpoint,
method: HTTPMethod,
completion: @escaping (Result<<DataResponse<Any>>, RequestError>) -> ()) { [weak self] in
if let myError = self?.myError {
// Send error with completion handler
} else if let dataResponse = self?.dataResponse {
// Send data response
}
}
}
Идея в том, что вы создаете экземпляр макета в своем тесте, а затем устанавливаете переменные по мере необходимости для проверки соответствующей части. Тогда ваш макет пройдет нормально.
Я не проверял этот код на правильность синтаксиса, поэтому дайте мне знать, если в нем есть ошибка.