如何验证内部属性是否设置了正确的值?

时间:2017-12-21 12:40:45

标签: c# unit-testing

这是一段代码:

[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?

2 个答案:

答案 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);
  }