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.
În acest material
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.
Î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
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.