【问题标题】:How can I mock a view/controller using NUnit and Moq?如何使用 NUnit 和 Moq 模拟视图/控制器?
【发布时间】:2020-04-26 20:32:31
【问题描述】:

我有一个 C# 应用程序(它是一个 Cocoa 应用程序),我需要使用 NUnit 和 Moq 测试视图/控制器,这有点困难。更确切地说,我有一个分层应用程序,连接到 sqlite-net 数据库。我想测试 add 方法。这是我的一张桌子:

public class User
{
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public String email { get; set; }
        public String password { get; set; 
}

我为此创建了一个 DBContext,我在其中创建了数据库、表并连接到数据库。作为一个分层的应用程序,我还有 UserRepo 和 UserBusinessLogic,我可以在其中进行所有查询。我的问题是,如何测试 addUser 操作?我需要提一下我正在使用 sqlite-pcl-net 作为数据库框架。 我已经试过了:

var mock = new Mock<IUserBLL>();
            User user = new User
            {
                email = "a@yahoo.com",
                password = "1234",

            };
var controller = new CreateController(mock.Object);

但是在尝试创建控制器时,我的测试失败并出现空异常。我正在考虑模拟设置?这是我的控制器:

public partial class CreateController : NSViewController
{
IUserBLL userBLL;

public CreateAccountController(IntPtr handle) : base(handle)
{
   Initialize();
   userBLL = new UserBLL();
}
/* I AM USING THIS ONE */
public CreateAccountController(IUserBLL userBLL) : base()
{
   Initialize();
   this.userBLL = userBLL;
}

我需要测试控制器及其方法,而不仅仅是数据库中的方法。

【问题讨论】:

    标签: c# sqlite nunit moq


    【解决方案1】:

    对于这种情况,最好在内存数据库中使用。你的情况应该是这样的

    //Create MemoryDB
    var options = new DbContextOptionsBuilder<ApplicationDbContext>()
                    .UseInMemoryDatabase(databaseName: "AddUserDb").Options;
    var dbContext = new ApplicationDbContext(options);
    // Initialize service
    var service = new IUserBLL();
    // Get AddUser function
    service.AddUser();
    

    【讨论】:

    • 我需要测试控制器,而不仅仅是数据库中的方法..
    【解决方案2】:

    除了 IUserBLL 的实例之外,对控制器的构造函数还有其他要求吗? Initialize() 或底层 NSViewContoller 类引用是否需要在此测试期间不可用或实例化的任何内容?

    附带说明,您创建的唯一“用户”变量根本没有被使用。确保您是从“安排、行动、断言”的角度进行此测试。设置好这些部分后,您要测试控制器上的什么操作?您认为在您的模拟存储库上执行该操作的结果应该是什么?

    已编辑: 根据您的附加代码,很明显基于new Controller() 的 ASP NET Core MVC 猜测是错误的(看起来您正在使用 Xamarin),因此删除了链接。

    【讨论】:

    • 这确实只是我代码的一部分。从这里开始,它只是一种尝试从控制器和一些断言执行单击的方法,并且用户变量是使用 mock.object.add(user) 添加的。但是,我在尝试创建控制器时仍然有一个空异常...
    • 如果是这种情况,您可能需要提供更多测试代码和您尝试实例化的控制器。仅根据您发布的内容,唯一明显的候选者是使用 new Controller() 而不是 new MySpecificController()
    • 我开始明白这会导致 null 异常,因为我只使用 IuserBll 这是一个接口,即使我使用模拟我也没有实例化或设置 UserBll ..你有什么想法如何纠正这个问题?
    • 模拟接口是进行单元测试的正确方法,并且您的代码更新使您更清楚您不是在谈论 ASP NET MVC 控制器。如果还没有,请在测试中放置一些断点并调试测试而不是运行它。它实际上在您实例化它的那一行失败了吗?如果是这样,堆栈跟踪是否提供任何指示,说明在创建期间具体是什么导致了 null 异常?
    • 是的,我确定..永远不会越过控制器,这就是测试失败的原因:System.ArgumentNullException:值不能为空。参数名称:obj
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2011-06-15
    • 2012-10-02
    • 2015-08-12
    相关资源
    最近更新 更多