C#: atestat și pregătire ONTI

C#: testează modelul înainte de a desena interfața

Construiește teste deterministe pentru logica unui quiz C#. Verifică scorul, răspunsurile duplicate și finalizarea înainte de integrarea în Windows Forms.

Un quiz are reguli care pot fi verificate fără butoane: fiecare întrebare acceptă un singur răspuns, un răspuns corect valorează zece puncte, iar după finalizare nu se mai acceptă răspunsuri. Dacă aceste reguli sunt împrăștiate în handleri, o modificare vizuală poate introduce o eroare de scor. Le păstrăm într-un model mic și îl verificăm prin apeluri directe.

Cum lucrezi cu exemplul

Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

Modelul primește vectorul de răspunsuri corecte și îl copiază, astfel încât apelantul să nu poată schimba testul după construire. HashSet reține întrebările deja evaluate. Answer întoarce false dacă întrebarea a fost rezolvată, indexul este invalid sau testul s-a încheiat. Pentru o încercare acceptată, scorul crește numai dacă opțiunea coincide cu cheia.

Testul nu citește ceasul, nu așteaptă rețeaua și nu depinde de ordinea unor fișiere. O metodă Check aruncă o excepție la primul rezultat incorect. Este suficientă pentru un exemplu didactic mic; într-un proiect mare poți muta aceleași scenarii într-un framework de testare.

Exemplu și rezultat așteptat

Cheia este [1, 2]. Răspunsul 1 la întrebarea 0 adaugă zece puncte. Repetarea aceleiași întrebări este refuzată. Răspunsul 0 la întrebarea 1 este acceptat, dar greșit; scorul rămâne zece. După Finish, alte încercări sunt refuzate. Programul afișează Teste quiz: OK numai după toate verificările.

Schemă pentru lecția 10: Întrebarea 0 → corect; Scor: 10; Repetare întrebare 0; Refuz; scor tot 10.Întrebarea 0 → corect → Scor: 10 → Repetare întrebare 0 → Refuz; scor tot 10.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Quiz {
    readonly int[] keys; readonly HashSet<int> answered=new HashSet<int>();
    bool finished;
    public int Score { get; private set; }
    public Quiz(int[] keys) { this.keys=(int[])keys.Clone(); }
    public bool Answer(int index,int choice) {
        if(finished || index<0 || index>=keys.Length || !answered.Add(index)) return false;
        if(keys[index]==choice) Score+=10;
        return true;
    }
    public void Finish() { finished=true; }
}
class Program {
    static void Check(bool ok) { if(!ok) throw new Exception("Test esuat"); }
    static void Main() {
        var quiz=new Quiz(new[] {1,2});
        Check(quiz.Answer(0,1)); Check(quiz.Score==10);
        Check(!quiz.Answer(0,1)); Check(quiz.Answer(1,0)); Check(quiz.Score==10);
        quiz.Finish(); Check(!quiz.Answer(1,2)); Check(!quiz.Answer(-1,1));
        Console.WriteLine("Teste quiz: OK");
    }
}

Rezultatul programului:

Teste quiz: OK

Greșeli și limite

Un test care calculează rezultatul așteptat prin aceeași formulă ca implementarea poate repeta aceeași greșeală. Folosește valori așteptate scrise independent. Nu te limita la scor: verifică și acceptarea sau refuzul operației. Interfața va necesita suplimentar teste de click, focalizare și stare a butoanelor; succesul modelului nu dovedește automat aceste comportamente.

Exersează

Adaugă scenariul în care ambele răspunsuri sunt corecte; scorul final trebuie să fie douăzeci. Modifică vectorul original după construirea quizului și verifică faptul că rezultatul nu se schimbă. Introdu un index minus unu și unul egal cu numărul întrebărilor: ambele trebuie refuzate fără excepție și fără modificarea scorului.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: salvează și recitește un catalog în XML

Lecția următoare: C#: primul formular și ciclul evenimentelor.

Referință: documentația Microsoft.

Întrebări frecvente

Pot testa fără o bibliotecă specială?

Da. Pentru exemplul mic folosim verificări care opresc programul dacă rezultatul diferă.

De ce copiez cheia răspunsurilor?

Pentru a proteja configurația quizului de modificările ulterioare ale vectorului apelantului.

Testele modelului înlocuiesc testarea ferestrei?

Nu. Modelul verifică regulile, iar interfața are propriile interacțiuni și stări de verificat.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →