web-dev-qa-db-fra.com

Comment utilisez-vous Moq pour simuler une interface simple?

D'accord, j'ai une classe de logique métier comme celle-ci:

Remarque: Pour le contexte, les fiches du vendeur sont de simples entités qui décrivent un "téléchargement" pour un document PDF PDF.

/// <summary>
/// Houses business level functions for dealing with vendor briefs.
/// </summary>
public class VendorBriefController : IVendorBriefController
{
    /// <summary>
    /// Vendor brief controller requires an instance of IVendorBriefRepository.
    /// </summary>
    IVendorBriefRepository _vendorBriefRepository;

    /// <summary>
    /// Initializes an instance of VendorBriefController.
    /// </summary>
    public VendorBriefController(IVendorBriefRepository vendorBriefRepository)
    {
        _vendorBriefRepository = vendorBriefRepository;
    }

    /// <summary>
    /// Get a list of string filters for vendor briefs.
    /// </summary>
    /// <returns>A list of string filters.</returns>
    public dynamic GetFilters()
    {
        List<string> filters = new List<string>
        {
            "All",
            "Active",
            "Inactive"
        };
        return filters;
    }

    /// <summary>
    /// Retrieve vendor brief entity from the repository by its unique ID.
    /// </summary>
    /// <param name="Id">The unique ID of the vendor brief.</param>
    /// <returns>A vendor brief entity.</returns>
    public VendorBrief GetVendorBriefForEditing(int Id)
    {
        var vendorBrief = _vendorBriefRepository.GetVendorBrief(Id);
        return vendorBrief;
    }

    /// <summary>
    /// Get a dynamic list of vendor briefs from the repository based on the supplied filter.
    /// </summary>
    /// <param name="filter">The filter to be used when retrieving vendor briefs.</param>
    /// <returns>A dynamic sorted & filtered list of vendor briefs to be displayed in a grid view.</returns>
    public dynamic GetVendorBriefList(string filter)
    {
        IEnumerable<VendorBrief> results = _vendorBriefRepository.GetVendorBriefs();
        switch (filter)
        {
            default:
                results = _vendorBriefRepository.GetVendorBriefs();
                break;
            case "Active":
                results = _vendorBriefRepository.GetVendorBriefs(true);
                break;
            case "Inactive":
                results = _vendorBriefRepository.GetVendorBriefs(false);
                break;
        }
        return from x in results
               orderby x.DisplayOrder
               select new
               {
                   ID = x.VendorBriefID,
                   Title = x.Title,
                   Active = x.IsActive,
                   DisplayOrder = x.DisplayOrder
               };
    }

    /// <summary>
    /// Save changes to the underlying repository in order to persist changes made to self-tracking vendor brief entities.
    /// </summary>
    /// <param name="vendorBrief"></param>
    public void EditVendorBrief(VendorBrief vendorBrief)
    {
        _vendorBriefRepository.SaveChanges();
    }

    /// <summary>
    /// Remove a vendor brief from the underlying repository.
    /// </summary>
    /// <param name="vendorBrief">The vendor brief to be removed.</param>
    public void DeleteVendorBrief(VendorBrief vendorBrief)
    {
        _vendorBriefRepository.DeleteVendorBrief(vendorBrief);
        _vendorBriefRepository.SaveChanges();
    }

    /// <summary>
    /// Add a vendor brief to the underlying repository.
    /// </summary>
    /// <param name="vendorBrief">The vendor brief to be added.</param>
    public void AddVendorBrief(VendorBrief vendorBrief)
    {
        _vendorBriefRepository.AddVendorBrief(vendorBrief);
        _vendorBriefRepository.SaveChanges();
    }
}

Je fais mes premiers pas dans les tests unitaires et j'apprends sur Moq. Je ne veux pas qu'une classe de tests unitaires entière soit écrite pour cela (sauf si vous en avez bien sûr envie: P) mais un simple échantillon suffira. Je suppose que je dois "simuler" IVendorBriefRepository pour pouvoir le passer au constructeur lors de la construction de mon contrôleur (à ne pas confondre avec les contrôleurs mvc), mais je ne sais pas comment le faire. Un exemple utilisant un peu de mon propre code m'aidera vraiment à démarrer.

Merci d'avance!

34
Chev

Quelque chose comme ça testerait DeleteVendorBrief, par exemple.

Mock<IVendorBriefRepository> mock = new Mock<IVendorBriefRepository>();

VendorBriefController controller = new VendorBriefController(mock.Object);

VendorBrief brief = new VendorBrief();

controller.DeleteVendorBrief(brief);

mock.Verify(f=>f.DeleteVendorBrief(brief));
mock.Verify(f=>f.SaveChanges());
43
Brook