我正面临一个我不太明白的问题。
我正在使用Entity Framework在C#/ ASP.net中开发一个应用程序。 我正在尝试对它进行一些单元测试,因此我需要模拟其中一个对象,而我似乎无法解决它。
这是我想要模拟的类: http://pastebin.com/pMypAM7G
如果当前不存在任何人,则此类返回一个新的DataSourceContainer,否则返回现有的一个(需要它以避免有多个上下文)
这是界面(仅用于允许模拟):http://pastebin.com/LRYVdA9j
以下是我要测试的功能:http://pastebin.com/naVsV3FX
以下是测试功能:http://pastebin.com/dY4ERzSJ
当我尝试进行测试时,我在getter中的Database类上收到错误,因为没有HttpContext(这是合乎逻辑的)。 我没有得到的是吸气剂应该被嘲笑。
我试图在互联网上查一查,但我无法弄清楚我做错了什么,所以如果有人可以帮我解决这个问题,我会非常感激。谢谢!
答案 0 :(得分:1)
您必须将Databaseobject注入测试方法。或者最好将它注入Userobjects构造函数,并且可能使它不是静态的,因为它现在似乎是静态的。
使用提供的解决方案,您不使用模拟对象。您正在Connexion函数中创建一个具体对象。
答案 1 :(得分:1)
您没有正确地补充代码以支持单元测试 - 您正在方法中创建外部对象(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;
}
您至少应阅读Dependency Injection。
这个简短的例子可以帮助您理解代码中的问题
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()
作为其值,但在测试时,模拟实现。