gpt4 book ai didi

c# - 我是否正确地编写了我的第一个 MSpec 规范?

转载 作者:IT王子 更新时间:2023-10-29 03:56:27 25 4
gpt4 key购买 nike

我正在编写我的第一个 MSpec 规范,我需要一些指导。我将规范留在“待定”状态,但上下文已填写。有什么需要改进的地方吗?

作为引用,这是故事和第一个场景:

Story: "Blog admin logs in to the system"

As a blog writer
I want to be able to log in to my blog
So that I can write posts and administer my blog

Scenario: "Logs in from the login page"

Given the user enters in correct credentials for a user in the system
When the user clicks the "Login" button
Then log the user in and redirect to the admin panel with a message
stating that he logged in correctly

还有 MSpec 代码(一些部分被截断),请注意,由于与 Moq.It 冲突,我不得不为 MSpec It 委托(delegate)设置别名:

using MoqIt = Moq.It;
using ThenIt = Machine.Specifications.It;

[Subject("User tries logging in")]
public class When_user_enters_valid_credentials : With_user_existing_in_membership
{
protected static ActionResult result;

Because of = () =>
{
result = loginController.Login(validUsername, validPassword);
};

ThenIt should_log_the_user_in;
ThenIt should_redirect_the_user_to_the_admin_panel;
ThenIt should_show_message_confirming_successful_login;
}

public abstract class With_user_existing_in_membership
{
protected static Mock<ISiteMembership> membershipMock;
protected static string validUsername;
protected static string validPassword;
protected static LoginController loginController;

Establish context =()=>
{
membershipMock = new Mock<ISiteMembership>();
validUsername = "ValidUsername";
validPassword = "ValidPassword";
//make sure it's treated as valid usernames and password
membershipMock
.Setup<bool>(m => m.Validate(
MoqIt.Is<string>(s => s == validUsername),
MoqIt.Is<string>(s => s == validPassword)))
.Returns(true);
loginController = new LoginController(membershipMock.Object);
};
}

最佳答案

上下文看起来不错。我喜欢你解决冲突的方式 It与别名。我认为可以改进 Moq 别名。考虑类似句子的东西。例如,Param.Is<T>Value.Is<T> .

一些注释,带有代码片段,然后在底部重写了整个规范。

场景是你的Subject

主题可以是故事中的场景。另外,它会与您的测试运行报告一起呈现(在 HTML 报告中特别好)。

[Subject("Login Page")]

不要在“With”命名基类上浪费时间

MSpec 的创建者 Aaron Jensen,has reverted完全使用“With”语法。上下文类名称不会出现在任何报告中,因此请避免花时间发明一个有意义的名称。

public abstract class MembershipContext

Given 是你的规范类名

在您的故事中以 Given 命名具体规范类。特别是因为基类名称没有在任何地方报告,您可能会在报告中丢失一半的上下文!您还应该避免将被测系统的名称放在上下文类名称中。这使您的上下文更便于重构被测系统。

public class When_an_existing_user_enters_valid_credentials

基本规范类应该只包含一般初始化

而且通常是不必要的。它们导致 Arrange 和 Act 阶段的分离。使用基类进行公共(public)字段初始化,例如设置模拟依赖项。但是,您不应该模拟基类中的行为。并且您不应该将特定于上下文的信息放在基类中。在您的示例中,用户名/密码。这样,您可以使用无效凭据创建第二个上下文。

Establish context = () =>
{
membership = new Mock<ISiteMembership>();
loginController = new LoginController(membership.Object);
};

具体规范类中的字段应该是私有(private)的

它减少了测试中语言的“仪式感”。您应该将它们放在所有 MSpec 特定代表的下方,因为规范的这些部分说明了大部分情况。

static ActionResult result;

规范大修

这里的规范是建立全局上下文的一个很好的例子 MembershipContext并在特定于规范的上下文中继承它(因此,额外的 Establish )。

[Subject("Login Page")]
public class When_an_existing_user_enters_valid_credentials : MembershipContext
{
Establish context = () =>
{
membership
.Setup<bool>(m => m.Validate(
Param.Is<string>(s => s == username),
Param.Is<string>(s => s == password)))
.Returns(true);
};

Because of = () => result = loginController.Login(username, password);

It should_log_the_user_in;
It should_redirect_the_user_to_the_admin_panel;
It should_show_message_confirming_successful_login;

static ActionResult result;
const string username = "username";
const string password = "password";
}

public abstract class MembershipContext
{
Establish context = () =>
{
membership = new Mock<ISiteMembership>();
loginController = new LoginController(membership.Object);
};

protected static Mock<ISiteMembership> membership;
protected static LoginController loginController;
}

关于c# - 我是否正确地编写了我的第一个 MSpec 规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1184297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com