这是一段代码:
[HttpPost(UriFactory.FOO_ROUTE)]
public async Task<ActionResult> AddFooAsync([FromRoute]string novelid, [FromBody]AddFoo command)
{
var novel = await RetrieveNovel(novelid);
if (novel == null) return NotFound();
if (!ModelState.IsValid) return BadRequest(ModelState);
command.FooId = Guid.NewGuid();
novel.AddFoo(command);
await _store.SaveAsync(novel);
return Created(UriFactory.GetFooRoute(novel.Novel.NovelId, command.FooId), command);
}
如何在单元测试中验证FooId确实设置了NewGuid?
答案 0 :(得分:2)
需要分离关注点。
我并不完全知道你在这里想做什么。但对我来说,这看起来像
检索并加载一些数据
var novel = await RetrieveNovel(novelid);
if (novel == null) return NotFound();
if (!ModelState.IsValid) return BadRequest(ModelState);
一些商业逻辑
command.FooId = Guid.NewGuid();
novel.AddFoo(command);
await _store.SaveAsync(novel);
也许如果你分开你的逻辑,你可以很容易地测试它们。
另外,如果您只想测试FooId属性&#39;价值改变了。然后你应该嘲笑其余的。就像加载小说一样,保存它和其他外部依赖,如UriFactory。
答案 1 :(得分:2)
使用Typemock Isolator,您可以验证内部属性是否设置如下:
[TestMethod, Isolated]
public void Test1
{
var testFoo = Isolate.Fake.Dependencies<AddFoo>();
var newGuid = new Guid();
testFoo.FooId = Guid.NewGuid()
Isolate.Verify.NonPublic.Property.WasCalledSet(testFoo, "FooId").WithArgument(newGuid);
}
或者你可以提取属性并断言它是Guid:
[TestMethod, Isolated]
public void Test2
{
var testFoo = Isolate.Fake.Dependencies<AddFoo>();
var fooID = Isolate.Invoke.Method(testFoo , "getFooID");
Assert.IsTrue(fooID is Guid);
}