Προγραμματισμός

Πώς να ενοποιήσετε τις στατικές μεθόδους δοκιμής στο C #

Όταν δημιουργείτε ή εργάζεστε σε εφαρμογές .NET, ενδέχεται να χρησιμοποιείτε συχνά στατικές μεθόδους. Οι μέθοδοι στο C # μπορεί να είναι είτε στατικές είτε μη στατικές. Μια μη στατική μέθοδος (επίσης γνωστή ως μέθοδος παρουσίας) μπορεί να γίνει επίκληση σε μια παρουσία της κλάσης στην οποία ανήκει. Οι στατικές μέθοδοι δεν χρειάζονται μια εμφάνιση της τάξης - μπορούν να κληθούν στην ίδια την τάξη.

Παρόλο που η δοκιμή μιας μη στατικής μεθόδου (τουλάχιστον μία που δεν καλεί μια στατική μέθοδο ή αλληλεπιδρά με εξωτερικές εξαρτήσεις) είναι απλή, η δοκιμή μιας στατικής μεθόδου δεν είναι καθόλου εύκολη υπόθεση. Αυτό το άρθρο μιλά για το πώς μπορείτε να ξεπεράσετε αυτήν την πρόκληση και να δοκιμάσετε τις στατικές μεθόδους στο C #.

[Επίσης για: Πώς να αναπαράγετε αντικείμενα του Θεού στο C #]

Για να εργαστείτε με τα παραδείγματα κώδικα που παρέχονται σε αυτό το άρθρο, θα πρέπει να έχετε εγκαταστήσει το Visual Studio 2019 στο σύστημά σας. Εάν δεν έχετε ήδη αντίγραφο, μπορείτε να κατεβάσετε το Visual Studio 2019 εδώ.

Δημιουργήστε ένα έργο εφαρμογής .NET Core κονσόλας στο Visual Studio

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα έργο εφαρμογής .NET Core Console στο Visual Studio. Υποθέτοντας ότι το Visual Studio 2019 είναι εγκατεστημένο στο σύστημά σας, ακολουθήστε τα βήματα που περιγράφονται παρακάτω για να δημιουργήσετε ένα νέο έργο εφαρμογής .NET Core κονσόλας στο Visual Studio.

  1. Εκκινήστε το Visual Studio IDE.
  2. Κάντε κλικ στο "Δημιουργία νέου έργου".
  3. Στο παράθυρο "Δημιουργία νέου έργου", επιλέξτε "Εφαρμογή κονσόλας (.NET Core)" από τη λίστα των προτύπων που εμφανίζονται.
  4. Κάντε κλικ στο Επόμενο.
  5. Στο παράθυρο "Διαμόρφωση του νέου έργου" που εμφανίζεται στη συνέχεια, καθορίστε το όνομα και την τοποθεσία για το νέο έργο.
  6. Κάντε κλικ στο Δημιουργία.

Αυτό θα δημιουργήσει ένα νέο έργο εφαρμογής .NET Core κονσόλας στο Visual Studio 2019. Με παρόμοιο τρόπο, δημιουργήστε δύο ακόμη έργα - μια βιβλιοθήκη κατηγορίας και ένα έργο δοκιμής μονάδας (δοκιμή xUnit). Θα χρησιμοποιήσουμε αυτά τα τρία έργα για να δείξουμε τη δοκιμή μονάδας στατικών μεθόδων στις επόμενες ενότητες αυτού του άρθρου.

Όταν μια στατική μέθοδος μπορεί και δεν μπορεί να ελεγχθεί μονάδα

Η δοκιμή μονάδας μιας στατικής μεθόδου δεν διαφέρει από τη δοκιμή μονάδας μιας μη στατικής μεθόδου. Οι στατικές μέθοδοι δεν μπορούν να δοκιμαστούν από μόνες τους. Μια στατική μέθοδος που δεν έχει καμία κατάσταση ή δεν αλλάζει κατάσταση μπορεί να δοκιμαστεί μονάδα. Εφόσον η μέθοδος και οι εξαρτήσεις της είναι αδιάφορες, η μέθοδος μπορεί να δοκιμαστεί σε μονάδα. Τα προβλήματα προκύπτουν όταν η στατική μέθοδος καλεί άλλες μεθόδους ή όταν το αντικείμενο που δοκιμάζεται καλεί τη στατική μέθοδο. Από την άλλη πλευρά, εάν το αντικείμενο που δοκιμάζεται καλεί μια μέθοδο παρουσίας, τότε μπορείτε να το δοκιμάσετε μονάδες εύκολα.

Μια στατική μέθοδος δεν μπορεί να ελεγχθεί μονάδα εάν ισχύει κάποιο από τα ακόλουθα:

  • Η στατική μέθοδος αλληλεπιδρά με εξωτερικές εξαρτήσεις όπως βάση δεδομένων, σύστημα αρχείων, δίκτυο ή εξωτερικό API.
  • Η στατική μέθοδος κρατά πληροφορίες κατάστασης, δηλαδή, εάν αποθηκεύει δεδομένα σε ένα στατικό αντικείμενο της κλάσης.

Εξετάστε το ακόλουθο απόσπασμα κώδικα που εμφανίζει δύο κλάσεις, συγκεκριμένα ProductBL και Logger. Ενώ το ProductBL είναι μια μη στατική τάξη, το Logger είναι μια στατική τάξη. Σημειώστε ότι η μέθοδος εγγραφής της κλάσης Logger κλήθηκε από τη μέθοδο LogMessage της κλάσης ProductBL.

δημόσια κατηγορία ProductBL

    {

δημόσιο άκυρο LogMessage (μήνυμα συμβολοσειράς)

        {

Logger.Write (μήνυμα);

        }

    }

δημόσιος κλάσης καταγραφέας

    {

δημόσιο στατικό κενό (μήνυμα συμβολοσειράς)

        {

// Γράψτε τον κωδικό σας εδώ για να καταγράψετε δεδομένα

        }

    }

Ας υποθέσουμε ότι η μέθοδος εγγραφής της κλάσης Logger συνδέεται με μια βάση δεδομένων και στη συνέχεια γράφει τα δεδομένα σε έναν πίνακα βάσης δεδομένων. Το όνομα της βάσης δεδομένων και ο πίνακας όπου θα πρέπει να γραφτούν τα δεδομένα ενδέχεται να είναι προεπιλεγμένες στο αρχείο appsettings.json. Πώς μπορείτε τώρα να γράψετε δοκιμές μονάδας για τη μέθοδο ProductBL;

Σημειώστε ότι οι στατικές μέθοδοι δεν μπορούν να κοροϊδεύονται εύκολα. Για παράδειγμα, εάν έχετε δύο κατηγορίες που ονομάζονται Α και Β και η τάξη Α χρησιμοποιεί ένα στατικό μέλος της τάξης Β, δεν θα μπορείτε να ενοποιήσετε την κλάση Α μεμονωμένα.

Τρεις τρόποι για τη δοκιμή μονάδων στατικών μεθόδων

Μπορείτε να χρησιμοποιήσετε το Moq για να παραπλανήσετε τις μη στατικές μεθόδους, αλλά δεν μπορεί να χρησιμοποιηθεί για να πλαστή τις στατικές μεθόδους. Αν και οι στατικές μέθοδοι δεν μπορούν να κοροϊδεύονται εύκολα, υπάρχουν μερικοί τρόποι για να πλαστογραφούν τις στατικές μεθόδους.

Μπορείτε να επωφεληθείτε από το πλαίσιο Moles ή Fakes από τη Microsoft για να πλαστήστε τις κλήσεις στατικών μεθόδων. (Το πλαίσιο Fakes συμπεριλήφθηκε στο Visual Studio 2012 ως διάδοχος του Moles - είναι η επόμενη γενιά Moles και Stubs.) Ένας άλλος τρόπος για να κοροϊδεύουμε τις κλήσεις στατικών μεθόδων είναι με τη χρήση αντιπροσώπων. Υπάρχει ένας ακόμη τρόπος να κλέψετε τις κλήσεις στατικών μεθόδων σε μια εφαρμογή - χρησιμοποιώντας τάξεις περιτυλίγματος και έγχυση εξάρτησης.

IMHO αυτή η τελευταία επιλογή είναι η καλύτερη λύση στο πρόβλημα. Το μόνο που χρειάζεται να κάνετε είναι να τυλίξετε την κλήση στατικής μεθόδου μέσα σε μια μέθοδο εμφάνισης και, στη συνέχεια, να χρησιμοποιήσετε έγχυση εξάρτησης για να εισάγετε μια παρουσία της κλάσης περιτυλίγματος στην υπό δοκιμή κλάση.

Δημιουργήστε μια τάξη περιτυλίγματος σε C #

Το παρακάτω απόσπασμα κώδικα απεικονίζει την κλάση LogWrapper που εφαρμόζει τη διασύνδεση IWrapper και τυλίγει μια κλήση στη μέθοδο Logger.Write () μέσα σε μια μέθοδο παρουσίας που ονομάζεται LogData.

δημόσια τάξη LogWrapper: IWrapper

    {

string _message = null;

δημόσιο LogWrapper (μήνυμα συμβολοσειράς)

        {

_message = μήνυμα;

        }

δημόσιο άκυρο LogData (μήνυμα συμβολοσειράς)

        {

_message = μήνυμα;

Logger.Write (_message);

        }

    }

Το παρακάτω απόσπασμα κώδικα εμφανίζει τη διασύνδεση IWrapper. Περιέχει τη δήλωση της μεθόδου LogData.

δημόσια διεπαφή IWrapper

    {

άκυρο LogData (μήνυμα συμβολοσειράς).

    }

Η κλάση ProductBL χρησιμοποιεί έγχυση εξάρτησης (έγχυση κατασκευαστή) για να εισάγει μια παρουσία της κλάσης LogWrapper όπως φαίνεται στην λίστα κωδικών που δίνεται παρακάτω.

δημόσια κατηγορία ProductBL

    {

μόνο για ανάγνωση IWrapper _wrapper;

στατική συμβολοσειρά _message = null;

δημόσιο ProductBL (περιτύλιγμα IWrapper)

        {

_wrapper = περιτύλιγμα;

        }

δημόσιο άκυρο LogMessage (μήνυμα συμβολοσειράς)

        {

_message = μήνυμα;

_wrapper.LogData (_message);

        }

    }

Η μέθοδος LogMessage της κλάσης ProductBL καλεί τη μέθοδο LogData στην παρουσία της κλάσης LogWrapper που έχει εισαχθεί νωρίτερα.

Χρησιμοποιήστε τα xUnit και Moq για να δημιουργήσετε μια μέθοδο δοκιμής μονάδας στο C #

Ανοίξτε το αρχείο UnitTest1.cs και μετονομάστε την κλάση UnitTest1 σε UnitTestForStaticMethodsDemo. Τα αρχεία UnitTest1.cs θα μετονομαστούν αυτόματα σε UnitTestForStaticMethodsDemo.cs. Τώρα θα εκμεταλλευτούμε το πλαίσιο Moq για να ρυθμίσουμε, να δοκιμάσουμε και να επαληθεύσουμε τα αστεία.

Το παρακάτω απόσπασμα κώδικα απεικονίζει πώς μπορείτε να χρησιμοποιήσετε το πλαίσιο Moq για να ενοποιήσετε τις μεθόδους δοκιμής στο C #.

var mock = νέο Mock ();

mock.Setup (x => x.LogData (It.IsAny ()));

νέο ProductBL (mock.Object) .LogMessage ("Hello World!");

mock.VerifyAll ();

Όταν εκτελείτε τη δοκιμή, δείτε πώς θα πρέπει να εμφανίζεται η έξοδος στο παράθυρο του Test Explorer.

Η πλήρης λίστα κωδικών της τάξης δοκιμής δίνεται παρακάτω για την αναφορά σας.

δημόσια τάξη UnitTestForStaticMethodsDemo

    {

[Γεγονός]

δημόσιο κενό StaticMethodTest ()

        {

var mock = νέο Mock ();

mock.Setup (x => x.LogData (It.IsAny ()));

νέο ProductBL (mock.Object) .LogMessage ("Hello World!");

mock.VerifyAll ();

        }

    }

Ο έλεγχος μονάδας είναι μια διαδικασία που ελέγχει μονάδες κώδικα σε μια εφαρμογή για να ελέγξει εάν τα πραγματικά αποτελέσματα από τη δοκιμή μονάδας ταιριάζουν με τα επιθυμητά αποτελέσματα. Εάν χρησιμοποιηθεί με σύνεση η δοκιμή μονάδας μπορεί να βοηθήσει στην αποτροπή σφαλμάτων στη φάση ανάπτυξης ενός έργου.

Οι στατικές μέθοδοι μπορεί να δημιουργήσουν πολλά προβλήματα όταν προσπαθείτε να τα δοκιμάσετε μονάδες χρησιμοποιώντας χλευασμούς. Εάν η αίτησή σας απαιτεί να παραπλανηθείτε μια στατική μέθοδο, θα πρέπει να λάβετε υπόψη ότι μια μυρωδιά σχεδιασμού - δηλαδή, μια ένδειξη κακού σχεδιασμού. Θα συζητήσω πιο χλευασμούς, ψεύτικα και στελέχη με περισσότερες λεπτομέρειες σε ένα μελλοντικό άρθρο εδώ.

Πώς να κάνετε περισσότερα στο C #:

  • Πώς να αναπαράγετε αντικείμενα του Θεού στο C #
  • Πώς να χρησιμοποιήσετε το ValueTask σε C #
  • Πώς να χρησιμοποιήσετε το αμετάβλητο στο C
  • Πώς να χρησιμοποιήσετε const, μόνο για ανάγνωση και στατικό σε C #
  • Πώς να χρησιμοποιήσετε σχολιασμούς δεδομένων στο C #
  • Πώς να εργαστείτε με GUID στο C # 8
  • Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη εναντίον διεπαφής στο C #
  • Πώς να εργαστείτε με το AutoMapper στο C #
  • Πώς να χρησιμοποιήσετε τις εκφράσεις λάμδα στο C #
  • Πώς να συνεργαστείτε με τους αντιπροσώπους Action, Func και Predicate στο C #
  • Πώς να συνεργαστείτε με εκπροσώπους στο C #
  • Πώς να εφαρμόσετε έναν απλό καταγραφέα στο C #
  • Πώς να εργαστείτε με χαρακτηριστικά στο C #
  • Πώς να εργαστείτε με το log4net στο C #
  • Πώς να εφαρμόσετε το μοτίβο σχεδίασης αποθετηρίου στο C #
  • Πώς να εργαστείτε με προβληματισμό στο C #
  • Πώς να εργαστείτε με το σύστημα παρακολούθησης αρχείων στο C #
  • Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #
  • Πώς να εργαστείτε με το MSMQ στο C #
  • Πώς να εργαστείτε με μεθόδους επέκτασης στο C #
  • Πώς να μας εκφράσεις λάμδα στο C #
  • Πότε να χρησιμοποιήσετε την ευμετάβλητη λέξη-κλειδί στο C #
  • Πώς να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης στο C #
  • Πώς να εφαρμόσετε τον πολυμορφισμό στο C #
  • Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #
  • Πώς να εργαστείτε με το RabbitMQ στο C #
  • Πώς να εργαστείτε με μια πλειάδα στο C #
  • Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #
  • Πώς να χρησιμοποιήσετε το Dapper ORM στο C #
  • Πώς να χρησιμοποιήσετε το μοτίβο σχεδιασμού flyweight στο C #
$config[zx-auto] not found$config[zx-overlay] not found