Почему модульные тесты С++ не работают с программой die

У меня написана следующая программа: умереть.ч

class Die {
    public:
        // Randomly assigns a value to roll_value in the range of 1 to 6
        void roll();
        // Returns roll_value
        int rolled_value() const;
    private:
        // Stores a randomly assigned value
        int roll_value;
        // Die sides, initialized to 6
        int sides = 6;
};

умереть.cpp

#include "die.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

void Die::roll() {
   srand(time(0));
   roll_value = rand()%sides + 1;
}
int Die::rolled_value() const {
   return roll_value;
}

main.cpp

#include "die.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>

using std::cout;

int main() {
  
   srand(time(0));
   Die die;
   int i = 0;
   for(i=1; i<=10; i++)
   {
       die.roll();
      Sleep(1000);
       cout << "Roll #"<< i << ", Roll Value: " << die.rolled_value() << "\n";
   }
   return 0;
}

Что выводит следующее:

Roll #1, Roll Value: 4
Roll #2, Roll Value: 1
Roll #3, Roll Value: 4
Roll #4, Roll Value: 2
Roll #5, Roll Value: 5
Roll #6, Roll Value: 2
Roll #7, Roll Value: 5
Roll #8, Roll Value: 3
Roll #9, Roll Value: 6
Roll #10, Roll Value: 3

Я тестирую следующий тест:

TEST_CASE("Test that die returns a value between 1 and 6") {
    Die die;
    REQUIRE(die.rolled_value() > 0);
    REQUIRE(die.rolled_value() < 7);
}

И получая, что этот тест терпит неудачу со следующим сообщением:

  REQUIRE( die.rolled_value() < 7 )
with expansion:
  11860256 (0xb4f920) < 7

===============================================================================
test cases: 2 | 1 passed | 1 failed
assertions: 3 | 2 passed | 1 failed

Я никогда не получал число больше 7 при запуске этой программы, но тест, тестирование на вывод больше 7 не работает... Почему это происходит?

Звоните srand(time(0)); только один раз, а не каждый раз, когда вы вытягиваете номер.

Bathsheba 09.12.2020 16:21

вы спрашиваете выпавшее число перед тем, как бросить кубик

463035818_is_not_a_number 09.12.2020 16:22

Судя по тесту, вы должны установить значение проката в конструкторе, а не как отдельный вызов функции-члена.

molbdnilo 09.12.2020 16:31

Итак, в конструкторе Class Die значение roll_value должно быть: int roll_value = 0; а не int roll_value; Я правильно понимаю? @молбднило

Erin 09.12.2020 16:46

Не в конструкторе, нет. У вас еще нет конструктора. Прочтите о них в вашей любимой книге по C++.

molbdnilo 09.12.2020 16:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы испытываете неопределенное поведение. Недопустимо читать значение до его инициализации.

Ваш тест показывает кое-что интересное: какое значение должно быть у кубика, если вы его еще не бросили?

Может быть, у вас должно быть нулевое значение, или, может быть, кубик нужно бросать при построении.

Как будет выглядеть код «бросать кубик при построении»? Установка "int roll_value = 1;" в конструкторе Class Die в файле die.h мои тесты прошли. Но было бы лучше с точки зрения получения случайного результата при первом «броске» бросить кубик при его построении? @guillaume

Erin 09.12.2020 16:54

Программа по-прежнему генерирует случайные результаты с int roll_value = 1; в конструкторе Class Die. Так что я бы предположил, что проблем не будет

Erin 09.12.2020 16:55

@ Эрин, да, но первый результат никогда не бывает случайным. Конструктор будет выглядеть так: Die() { roll(); } или даже лучше, сделайте функцию, которая возвращает новое случайное число, и используйте ее как для инициализации первого значения, так и для броска костей.

Guillaume Racicot 09.12.2020 18:25

Другие вопросы по теме