c# - 你如何使用 Moq 来模拟一个简单的界面?

标签 c# unit-testing dependency-injection mocking moq

好的,我有一个这样的业务逻辑类:

注意:就上下文而言,供应商简介是描述 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();
    }
}

我正在迈出单元测试的第一步,并且正在学习最小起订量。我不想为此编写一个完整的单元测试类(当然,除非您喜欢 :P),但一个简单的示例就可以了。我假设我需要“模拟”IVendorBriefRepository 以便在构建 Controller 时将其传递到构造函数中(不要与 mvc Controller 混淆),但我不确定该怎么做它。使用我自己的一些代码的示例将真正帮助我入门。

提前致谢!

最佳答案

例如,像这样的东西会测试 DeleteVendorBrief。

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());

关于c# - 你如何使用 Moq 来模拟一个简单的界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627371/

相关文章:

c# - 使用linq从xml中获取键值对

c# - 是否必须在开始使用 c# 4.0 之前学习所有其他版本的 c#?

java - 我怎样才能 "intercept"一个方法调用进行测试?

c# - StructureMap:选择嵌套依赖的具体类型

jakarta-ee - 选择要注入(inject)的 EJB 无需重新编译

C# 编码(marshal)处理 - 获取 C char** 的内容并转换为 byte[]

node.js - 在 Mocha 中使用 EJS 测试渲染 View

c# - 错误 : "Spatial types and functions are not available for this provider"

asp.net-mvc-3 - 是否推荐这种构造函数注入(inject)?

c# - 需要一个带有事件的集合类