我正在实现一些集成测试,有一个实体具有某些必须遵守的属性,该实体如下:
[Table("ManualClassifiers")]
public class ManualClassifier : Classifier
{
[RegularExpression(@"^([a-zA-Z]+?)([-\s'][a-zA-Z]+)*?")]
[Required(ErrorMessage = "First name field is mandatory")]
[Column(name: "first_name")]
public string FirstName { get; set; }
[RegularExpression(@"^([a-zA-Z]+?)([-\s'][a-zA-Z]+)*?")]
[Required(ErrorMessage = "Last name field is mandatory")]
[Column(name: "last_name")]
public string LastName { get; set; }
[EmailAddress]
[Required(ErrorMessage = "Email field is mandatory")]
[Column(name: "email")]
public string Email { get; set; }
[RegularExpression(@"^[a-zA-Z0-9._]+$")]
[Required(ErrorMessage = "Username field is mandatory")]
[Column(name: "username")]
public string Username { get; set; }
[Required(ErrorMessage = "Password hash field is mandatory")]
[Column(name: "passwordHash")]
public string PasswordHash { get; set; }
[Required(ErrorMessage = "Password salt field is mandatory")]
[Column(name: "passwordSalt")]
public string PasswordSalt { get; set; }
}
当尝试验证第一个正则表达式时,我的测试总是通过(即使我的输入是一白色,因此应该失败或抛出一些错误)。
[TestMethod]
public async Task Insert_ManualClassifier_With_Empty_Field_Fails()
{
using var connection = new SqliteConnection("DataSource=:memory:");
connection.Open();
var options = new DbContextOptionsBuilder<DataContext>()
.UseSqlite(connection) // Set the connection explicitly, so it won't be closed automatically by EF
.Options;
// Create the dabase schema
// MigrateAsync if using Migrations
using (var context = new DataContext(options))
{
await context.Database.EnsureCreatedAsync();
} // The connection is not closed, so the database still exists
using (var context = new DataContext(options))
{
var user = new ManualClassifier()
{
FirstName = " ", //this is where it should not match the regular expression and fail
LastName = "Last",
Email = "example@gmail.com",
Username = "firstlast123"
};
IRepositoryService repoService = new RepositoryService(context, NullLogger<RepositoryService>.Instance);
string passwordHash = "pwhash";
string passwordSalt = "pwsalt";
int userID = await repoService.CreateUser(user, passwordHash, passwordSalt);
}
}
这是我正在调用的存储库方法:
public async Task<int> CreateUser(ManualClassifier user, string passwordHash, string passwordSalt)
{
//TO DO: CREATE UPPER LAYER IN REPO PROJECT TO MAP RESULTS
if (_context.ManualClassifiers.Any(u => u.Username == user.Username))
{
_logger.LogDebug($"User with email {user.Username} already exists");
throw new UsernameAlreadyExistsException(user.Username);
}
if (_context.ManualClassifiers.Any(u => u.Email == user.Email))
{
_logger.LogDebug($"User with email {user.Email} already exists");
throw new EmailAlreadyExistsException(user.Email);
}
user.PasswordHash = passwordHash;
user.PasswordSalt = passwordSalt;
user.Email = user.Email.ToLower();
_logger.LogDebug("New user created successfully");
await _context.ManualClassifiers.AddAsync(user);
await _context.SaveChangesAsync();
return user.Id;
}
1条答案
按热度按时间mum43rcc1#
FirstName
和LastName
的正则表达式验证缺少字符串锚$
。应将$
定位点添加到这两个字段的正则表达式验证中。