【发布时间】:2014-07-16 11:11:24
【问题描述】:
我正在使用 xUnit 来测试我的项目。我有一个测试来检查 user 是否已添加到 users 的 list 中,如下所示:
private readonly IJsonService _jsonService;
private readonly IUserService _userService;
[Fact]
public void Add_User_To_User_List()
{
//Given
_userService = new UserService(_jsonService, _guidService);
_jsonService = Substitute.For<IJsonService>();
var _fakeUserJsonFile = "Users.json";
var _fakeNewUser = new User()
{
ID = new Guid(),
FirstName = "Denis",
LastName = "Menis"
};
var _fakeUserList = new List<User>
{
new User()
{
ID = new Guid(),
FirstName = "Paddy",
LastName = "Halle"
},
new User()
{
ID = new Guid(),
FirstName = "Job",
LastName = "Blogs"
}
};
var _fakeUpdatedUserList = new List<User>
{
new User()
{
ID = new Guid(),
FirstName = "Paddy",
LastName = "Halle"
},
new User()
{
ID = new Guid(),
FirstName = "Job",
LastName = "Blogs"
},
new User()
{
ID = new Guid(),
FirstName = "Denis",
LastName = "Menis"
}
};
_jsonService.DeserializeObject<User>(_fakeUserJsonFile).Returns(_fakeUserList);
_jsonService.SerializeObject(_fakeUserJsonFile, _fakeUpdatedUserList).Returns(true);
//When
var result = _userService.AddUser(_fakeNewUser);
//Then
Assert.Contains(_fakeNewUser, _fakeUpdatedUserList);
}
现在我知道代码有效,因为我先编写了它,但是当我运行测试时它失败了!下面是我将用户添加到用户列表的代码:
public bool AddUser(User user)
{
var userList = GetUsers();
user.ID = _guidService.NewGuid();
userList.Add(user);
var serializeObject = _jsonService.SerializeObject(_fileName, userList);
return serializeObject;
}
GetUser 方法:
public List<User> GetUsers()
{
return _jsonService.DeserializeObject<User>(_fileName).ToList();
}
反序列化方法:
private readonly IFileSystem _file;
private readonly HttpContextBase _httpContext;
private readonly ILogger _logger;
public JsonService(IFileSystem file, HttpContextBase httpContext, ILogger logger)
{
_file = file;
_httpContext = httpContext;
_logger = logger;
}
public IEnumerable<T> DeserializeObject<T>(string fileName)
{
try
{
var relativeFileName = _httpContext.Server.MapPath(fileName);
var readFile = _file.ReadAllText(relativeFileName);
var list = JsonConvert.DeserializeObject<List<T>>(readFile);
return list;
}
catch (Exception ex)
{
_logger.LogException(ex);
return null;
}
}
文件系统类:
public class FileSystem : IFileSystem
{
public void WriteAllText(string path, string contents)
{
File.WriteAllText(path, contents);
}
public string ReadAllText(string path)
{
return File.ReadAllText(path);
}
}
当我运行测试时,AddUser 方法中的var serializeObject = _jsonService.SerializeObject(_fileName, userList); 每次都返回 false。
我认为这样做是因为即使它是与预期结果相同的数据,但在内存中它是对相同数据的不同引用。
谁能帮我解决这个问题,我希望它返回相同的引用数据。如果我不是很清楚,我可以详细说明。谢谢
【问题讨论】:
-
你能显示一些设置代码吗?特别是,将
_fileName链接到_fakeUserJsonFile和userList链接到_fakeUpdatedUserList的代码? -
@Lilshieste 我已更新代码以显示数据
-
谢谢!还有一个问题:您使用的是什么模拟框架? N替代? (即
_jsonService的类型是什么?) -
我正在使用 NSubstitute 是的。我会更新
_jsonService代码,它只是一个读写通用json文件的类 -
你不能同时使用 _fakeUserList 和 _fakeUpdatedUserList 吗?
标签: c# asp.net unit-testing xunit nancy