C# Moq Class 带接口
C# Moq Class with Interface
我尝试制作 unit-testing
的 class User
我试着用一个接口来做,但我不明白到底是什么,以及它是否是进行测试的正确方法,所以:
我的ClassUser
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));
}
}
测试结果正确,实际returnstrue
,但不明白界面的使用方法
基本上,通过模拟,您可以为该接口创建某种虚拟实现。因此,当调用 Mock<IUser>()
时,编译器会生成一个实现接口 IUser
的匿名 class 和 return 这个 class 的新实例。现在,在创建 User
-object 时,您会注入该虚拟对象。模拟对象没有任何行为,它的所有成员都设置为它们的默认值,只保证它们 是 设置为任何值。您还可以更改成员的值 return 但这不会影响您的示例。
这样您就可以测试您感兴趣的方法,而无需实现任何外部依赖项。这可能是必要的,因为您目前没有 IUSer
接口的工作实例并稍后实现它,或者因为它的初始化非常繁重并且您希望避免在测试中初始化它(想想一些数据库逻辑包括不会影响您的实际测试,但需要 运行 测试)。
在您的情况下,您甚至可以使用 new User(null)
,因为要测试的方法根本不依赖于该接口的实例。所以你根本不需要嘲笑它。
我尝试制作 unit-testing
的 class User
我试着用一个接口来做,但我不明白到底是什么,以及它是否是进行测试的正确方法,所以:
我的ClassUser
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));
}
}
测试结果正确,实际returnstrue
,但不明白界面的使用方法
基本上,通过模拟,您可以为该接口创建某种虚拟实现。因此,当调用 Mock<IUser>()
时,编译器会生成一个实现接口 IUser
的匿名 class 和 return 这个 class 的新实例。现在,在创建 User
-object 时,您会注入该虚拟对象。模拟对象没有任何行为,它的所有成员都设置为它们的默认值,只保证它们 是 设置为任何值。您还可以更改成员的值 return 但这不会影响您的示例。
这样您就可以测试您感兴趣的方法,而无需实现任何外部依赖项。这可能是必要的,因为您目前没有 IUSer
接口的工作实例并稍后实现它,或者因为它的初始化非常繁重并且您希望避免在测试中初始化它(想想一些数据库逻辑包括不会影响您的实际测试,但需要 运行 测试)。
在您的情况下,您甚至可以使用 new User(null)
,因为要测试的方法根本不依赖于该接口的实例。所以你根本不需要嘲笑它。