我试着做一个unit-testing的User类
我试图用一个接口来完成这个任务,但是我并不完全理解什么是什么,以及它是否是进行测试的正确方法,所以:
我的班User
public class User : IUser
{
public int id { get; private set; }
public string username { get; set; }
public IUser user;
public User(IUser userI) // constructor with interface
{
user = userI;
}
public virtual bool MyFunction(string test)
{
if(test=="ping")
return true;
else
return false;
}
}我的接口IUser
public interface IUser
{
int id { get; }
string username { get; set; }
}然后我的单元测试
[TestFixture]
public class MoqTest
{
[Test]
public void TestMyFunction()
{
var mock = new Mock<IUser>();
User user = new User(mock.Object);
var result = user.MyFunction("ping");
Assert.That(result, Is.EqualTo(true));
}
}测试结果是正确的,并且实际上返回true,但不理解使用接口的方式。
发布于 2016-03-16 14:28:53
基本上,通过模仿,您可以为该接口创建某种虚拟实现。因此,当调用Mock<IUser>()时,编译器生成一个实现接口IUser并返回该类的新实例的匿名类。现在,在创建User-object时,需要注入这个虚拟对象。模拟对象没有行为,它的所有成员都被设置为其默认值,只能保证它们被设置为任何东西。您也可以更改您的成员返回的值,但这不会影响您的示例。
这样,您就可以测试您感兴趣的方法,而不必实现任何外部依赖。这可能是必要的,因为您目前没有IUSer-interface的工作实例并在以后实现它,或者因为它的初始化非常重,并且您希望避免在测试中初始化它(请考虑一些不影响实际测试但需要运行测试的数据库逻辑)。
在您的情况下,您甚至可以使用new User(null),因为要测试的方法根本不依赖于该接口的实例。所以你根本不用嘲笑它。
https://stackoverflow.com/questions/36038492
复制相似问题