Что лучший способ к модульному тесту от нескольких потоков?

Swift 2 с ошибкой Ручка и пользовательский заголовок запроса

Просто добавьте расширение в UIImageView:

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSMutableURLRequest(URL: url)
            request.setValue("<YOUR_HEADER_VALUE>", forHTTPHeaderField: "<YOUR_HEADER_KEY>")
            NSURLSession.sharedSession().dataTaskWithRequest(request) {
                (data, response, error) in
                guard let data = data where error == nil else{
                    NSLog("Image download error: \(error)")
                    return
                }

                if let httpResponse = response as? NSHTTPURLResponse{
                    if httpResponse.statusCode > 400 {
                        let errorMsg = NSString(data: data, encoding: NSUTF8StringEncoding)
                        NSLog("Image download error, statusCode: \(httpResponse.statusCode), error: \(errorMsg!)")
                        return
                    }
                }

            dispatch_async(dispatch_get_main_queue(), {
                NSLog("Image download success")
                self.image = UIImage(data: data)
            })
            }.resume()
        }
    }
}

И затем используйте новый imageFromUrl(urlString: String) для загрузки изображения

Использование:

imageView.imageFromUrl("https://i.imgur.com/ONaprQV.png")
17
задан Community 23 May 2017 в 12:16
поделиться

3 ответа

В.NET ThreadPool потоки не возвратятся, не настраивая ManualResetEvent с или AutoResetEvent с. Я нахожу их излишеством для быстрого метода тестирования (не говоря уже о довольно сложном, чтобы создать, установить, и справиться). Рабочий Background также немного сложен с обратными вызовами и таким.

Что-то я нашел, что работы

  1. , Создают массив потоков.
  2. Установка ThreadStart метод каждого потока.
  3. Запускают каждый поток.
  4. Соединение на всех потоках (блокирует текущий поток до всех других завершенных потоков или аварийное прекращение работы)
public static void MultiThreadedTest()
{
    Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    foreach(Thread thread in threads)
    {
        thread.Join();
    }
}
13
ответ дан 30 November 2019 в 14:29
поделиться

@ajmastrean, так как результат модульного теста должен быть предсказуемым, мы должны синхронизировать потоки так или иначе. Я не вижу простой способ сделать это, не используя события.

я нашел тот ThreadPool. QueueUserWorkItem дает мне простой способ протестировать такие варианты использования

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});
1
ответ дан 30 November 2019 в 14:29
поделиться

Ваша идея должна хорошо работать. В основном Вы просто хотите породить набор потоков и удостовериться те пишущие, что файл занимает много времени достаточно, чтобы сделать это, чтобы на самом деле заставить читателей ожидать. Если весь Ваш возврат потоков без ошибки, и не блокируясь навсегда, то тест успешно выполняется.

-2
ответ дан 30 November 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: