好的,所以我有以下模块,它从表中返回用户 ID 列表,其中 id 与正则表达式匹配:
public sealed class UserIdListRetriever : IUserIdListRetriever
{
private readonly EntityFrameworkClass _databaseConnection;
public UserIdListRetriever(EntityFrameworkClass databaseConnection)
{
_databaseConnection = databaseConnection;
}
public IEnumerable<string> Retrieve()
{
var salesAgents = _databaseConnection
.tblAccounts
.Select(account => account.UserId)
.Distinct();
var regex = new Regex(@"(?<=\\)(.*?)(?=\:)");
return (from agent in salesAgents
.AsEnumerable()
select regex.Match(agent)
into match
where match.Success
select match.Value.ToUpper())
.OrderBy(match => match);
}
}
这是界面:
public interface IUserIdListRetriever
{
IEnumerable<string> Retrieve();
}
我一直在读我应该测试行为,而不是实现,但我在这里关心的是我的班级是否返回准确的用户 ID 列表。
我可以创建一个 IUserIdListRetriever 的模拟实现,并且可能在我的单元测试中断言我返回一个不为空的字符串的 IEnumerable,但这不会测试我的 LINQ 是否正确,或者我的正则表达式是正确的,但感觉没有那么有用。
我觉得这两件事在这里很重要(无论我的 LINQ 是否正确,以及我的正则表达式是否正确),我最终得到了这样的测试类:
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
etc etc
namespace myNamespaceTests
{
[TestClass]
public class UserIdListRetrieverTests
{
[TestMethod]
public void UserIdListRetrieverReturnsAccurateInformation()
{
var databaseConnection =
new EntityFrameworkClass("connection;string;");
var userIdListRetriever = new UserIdListRetriever(databaseConnection );
var userIds = userIdListRetriever.Retrieve();
/*
* I put a breakpoint here,
* and run the same query in SQL Management studio
* to make sure I have the same results
*/
Assert.IsTrue(userIds.Any());
}
}
}
这感觉非常错误,但从我的角度来看,我发现这是最有用的,因为它仍然允许我快速(虽然不是那么快)测试这个模块正在做我想让它做的事情。
我有很多这样的模块,我的代码仍然是模块化和可测试的,但我发现只有当我花一点时间手动运行单元测试、逐步检查每个模块并手动对数据库运行查询以验证时,这些测试才有用我的数据检索模块给我的信息是我期望看到的。在此之后,我可以自信地说,我的代码库中的每个模块都按照我的意愿去做。
我不认识其他人以这种方式工作,这通常是一个不好的迹象(我错了,还是其他人都错了?)。知识渊博的人可以解释我在哪里出错并解释他们如何测试上面的类,以一种他们可以快速运行测试并且这些测试是自动化的方式,但他们可以自信地说他们的每个模块都有预期的行为?
谢谢