模拟属性(或获取者)
本文关键字:获取 属性 模拟 | 更新日期: 2023-09-27 18:35:39
我遇到了一个不太明白的问题。
我正在使用实体框架在 C#/ASP.net 中开发一个应用程序。我正在尝试对它进行一些单元测试,因此我需要模拟其中一个对象,但我似乎无法解决它。
这是我想模拟的类:http://pastebin.com/pMypAM7G
如果当前不存在任何内容,则此类返回一个新的数据源容器,否则返回现有容器(需要它以避免具有多个上下文)
这是界面(唯一目的是允许模拟 http://pastebin.com/LRYVdA9j):
这是我试图测试的功能: http://pastebin.com/naVsV3FX
这是测试功能: http://pastebin.com/dY4ERzSJ
当我尝试进行测试时,我在 getter 中的数据库类上出现错误,因为没有 HttpContext(这是合乎逻辑的)。我不明白的是,getter应该被嘲笑。
我试图在互联网上查找它,但我无法弄清楚我做错了什么,所以如果有人可以帮助我解决这个问题,我将不胜感激。谢谢!
您尚未正确构建代码以支持单元测试 - 您正在方法中创建外部对象(Database
)。此外,您没有使用IDatabase
接口,而是Database
的具体实现
public static User Connexion(String login, String MotDePasse)
{
Database bdd = new Database(); // this is inline, concrete implementation, this cannot be mocked
User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login);
if (us == null)
throw new Exception("Nom d'utilisateur erroné");
if (us.password != MotDePasse)
throw new Exception("Mot de passe erroné");
else
return us;
}
您至少应该阅读有关依赖注入的信息。
这个简短的示例可以帮助您理解代码中的问题
public static User Connexion(String login, String MotDePasse, IDatabase bdd)
{
User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login);
if (us == null)
throw new Exception("Nom d'utilisateur erroné");
if (us.password != MotDePasse)
throw new Exception("Mot de passe erroné");
else
return us;
}
这一次,Connexion松散地绑定到IDatabase接口,而不是它的实现。在运行时,您将提供new Database()
作为其值,但在测试时,模拟实现。
您必须将数据库对象注入到测试的方法中。或者最好将其注入 Userobjects 构造函数,也许使其不是静态的,因为它现在似乎是静态的。
使用提供的解决方案,您不会使用模拟对象。您正在Connexion函数中创建一个具体对象。