在我们的应用程序中,我为我们的网站创建了一个登录测试。如果此测试成功,则登录成功。现在要为网站的其他部分创建测试,我需要先登录。
有没有办法让我创建的所有其他测试先运行登录测试?例如:是否可以创建一个自定义登录测试属性,我可以将其放在所有其他测试方法上,以便它们首先运行登录?但是我还需要登录测试的返回值!
如果没有,那么我将只需编写一个执行登录操作的普通C#函数,我将需要将该函数调用作为每个测试的第一行。
答案 0 :(得分:3)
当您编写单元测试时,您正在隔离中测试每种方法。意思是,您正在测试的方法不能,也不能依赖于其他任何东西才能运行。
你现在遇到问题的原因,可能是因为你至少打破了单一的责任原则(说明你的班级应该只有一个理由要改变)。我可以假设这是因为您声明类中的OTHER方法依赖于登录成功。以下是解决方法:
为您的登录方法创建一个界面,例如:
public interface ILoginManager{
void Authenticate(string username, string password);
void IsAuthenticated{ get;}
}
接下来,使用依赖性倒置原则,将此接口添加到您的类中,并使用其中的方法:
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;
}
}
现在,在所有测试中,您可以模拟LoginManager,并在那里设定您的期望,即
[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() );
}
答案 1 :(得分:2)
基类怎么样?
[TestClass]
public class AuthenticatedTest
{
[TestInitialize]
public void TestInitialize()
{
// login
}
}
[TestClass]
public class MyTests : AuthenticatedTest
{
[TestMethod]
public void Whatever()
{
// already logged in.
}
}
您不应该编写依赖其他测试的测试。如果您之前需要登录,则必须先记录n,而不是&#34;运行登录测试&#34;。它可能与代码差别不大,但概念不同。