C# - MS 测试 - 创建一个先运行另一个测试的测试
C# - MS Test - Create a test that runs another test first
在我们的应用程序中,我为我们的网站创建了一个登录测试。如果此测试成功,则登录成功。现在要为网站的其他部分创建测试,我需要先执行登录。
有没有办法让我将创建的所有其他测试首先 运行 登录测试?例如:是否可以创建一个我可以放在所有其他测试方法上的自定义登录测试属性,以便它们 运行 首先登录?但是我还需要那个登录测试的 return 值!
如果没有,那么我将不得不编写一个普通的 C# 函数来执行登录操作,并且我需要将该函数调用作为每个测试的第一行。
当您编写单元测试时,您是在 隔离 中测试每个方法。意思是,你正在测试的方法不能,也不能为了 运行 依赖任何其他东西。
你现在有问题的原因,可能是因为你至少违反了单一责任原则(声明你的class应该只一个单一的原因被改变)。我可以假设这是因为您在 class 中声明您的其他方法取决于登录是否成功。解决方法如下:
为您的登录方法创建一个界面,例如:
public interface ILoginManager{
void Authenticate(string username, string password);
void IsAuthenticated{ get;}
}
接下来,使用 依赖倒置原则 ,将此接口添加到您的 class 中,其中包含方法:
public class MyWorkerClass
{
private readonly ILoginManager _loginManager;
public MyWorkerClass(ILoginManager loginManager){
_loginManager = loginManager;
}
public bool LogOnUser(string userName, string password){
_loginManager.Authenticate(userName, password);
return _loginManager.IsAuthenticated;
}
}
现在,在所有测试中,您可以模拟登录管理器,并在那里设置您的期望,即
[TestMethod]
public void SomeMethod_UserIsAuthenticated_InvokesSomeOtherMethod()
{
// Arrange
GetMockFor<ILoginManager>().SetupGet(lm => lm.Authenticated).Returns(true);
// Act
var result = Instance.SomeMethod();
// Assert
GetMockFor<ISomeOtherInterface>()
.Verify(o => o.SomeOtherMethod(), Times.AtLeastOnce() );
}
基地 class 怎么样?
[TestClass]
public class AuthenticatedTest
{
[TestInitialize]
public void TestInitialize()
{
// login
}
}
[TestClass]
public class MyTests : AuthenticatedTest
{
[TestMethod]
public void Whatever()
{
// already logged in.
}
}
您不应该编写依赖于其他测试的测试。如果需要之前登录,则要先登录n,而不是"run the login test"。应该不是代码的区别,而是概念的区别。
在我们的应用程序中,我为我们的网站创建了一个登录测试。如果此测试成功,则登录成功。现在要为网站的其他部分创建测试,我需要先执行登录。
有没有办法让我将创建的所有其他测试首先 运行 登录测试?例如:是否可以创建一个我可以放在所有其他测试方法上的自定义登录测试属性,以便它们 运行 首先登录?但是我还需要那个登录测试的 return 值!
如果没有,那么我将不得不编写一个普通的 C# 函数来执行登录操作,并且我需要将该函数调用作为每个测试的第一行。
当您编写单元测试时,您是在 隔离 中测试每个方法。意思是,你正在测试的方法不能,也不能为了 运行 依赖任何其他东西。
你现在有问题的原因,可能是因为你至少违反了单一责任原则(声明你的class应该只一个单一的原因被改变)。我可以假设这是因为您在 class 中声明您的其他方法取决于登录是否成功。解决方法如下:
为您的登录方法创建一个界面,例如:
public interface ILoginManager{
void Authenticate(string username, string password);
void IsAuthenticated{ get;}
}
接下来,使用 依赖倒置原则 ,将此接口添加到您的 class 中,其中包含方法:
public class MyWorkerClass
{
private readonly ILoginManager _loginManager;
public MyWorkerClass(ILoginManager loginManager){
_loginManager = loginManager;
}
public bool LogOnUser(string userName, string password){
_loginManager.Authenticate(userName, password);
return _loginManager.IsAuthenticated;
}
}
现在,在所有测试中,您可以模拟登录管理器,并在那里设置您的期望,即
[TestMethod]
public void SomeMethod_UserIsAuthenticated_InvokesSomeOtherMethod()
{
// Arrange
GetMockFor<ILoginManager>().SetupGet(lm => lm.Authenticated).Returns(true);
// Act
var result = Instance.SomeMethod();
// Assert
GetMockFor<ISomeOtherInterface>()
.Verify(o => o.SomeOtherMethod(), Times.AtLeastOnce() );
}
基地 class 怎么样?
[TestClass]
public class AuthenticatedTest
{
[TestInitialize]
public void TestInitialize()
{
// login
}
}
[TestClass]
public class MyTests : AuthenticatedTest
{
[TestMethod]
public void Whatever()
{
// already logged in.
}
}
您不应该编写依赖于其他测试的测试。如果需要之前登录,则要先登录n,而不是"run the login test"。应该不是代码的区别,而是概念的区别。