Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证内部属性设置的值是否正确?_C#_Unit Testing - Fatal编程技术网

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

C# 如何验证内部属性设置的值是否正确?,c#,unit-testing,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 (!Model

下面是一段代码:

[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);
}
[HttpPost(UriFactory.FOO_路径)]
公共异步任务AddFooAsync([FromRoute]string novelid,[FromBody]AddFoo命令)
{
var novel=等待检索(novelid);
if(novel==null)返回NotFound();
如果(!ModelState.IsValid)返回BadRequest(ModelState);
command.FooId=Guid.NewGuid();
novel.AddFoo(命令);
wait_store.SaveAsync(新颖);
创建的返回(UriFactory.GetFooRoute(novel.NovelId.command.FooId),command);
}

如何在单元测试中验证FooId是否确实设置了新GUID?

需要将关注点分开。

我不知道你到底想干什么。但对我来说这看起来像

检索并加载一些数据

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属性的值是否更改。那么你应该嘲笑其他人。例如加载小说、保存小说以及其他外部依赖性,如UriFactory。

需要分离关注点。

我不知道你到底想干什么。但对我来说这看起来像

检索并加载一些数据

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属性的值是否更改。那么你应该嘲笑其他人。与加载小说、保存小说以及其他外部依赖项(如UriFactory)类似。

使用,您可以验证内部属性的设置是否如下所示:

  [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);
  }
[测试方法,隔离]
公共无效测试1
{
var testFoo=Isolate.false.Dependencies();
var newGuid=newGuid();
testFoo.FooId=Guid.NewGuid()
隔离.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);
  }
[测试方法,隔离]
公开无效测试2
{
var testFoo=Isolate.false.Dependencies();
var fooID=Isolate.Invoke.Method(testFoo,“getFooID”);
IsTrue(fooID是Guid);
}
使用,您可以验证内部属性是否设置如下:

  [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);
  }
[测试方法,隔离]
公共无效测试1
{
var testFoo=Isolate.false.Dependencies();
var newGuid=newGuid();
testFoo.FooId=Guid.NewGuid()
隔离.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);
  }
[测试方法,隔离]
公开无效测试2
{
var testFoo=Isolate.false.Dependencies();
var fooID=Isolate.Invoke.Method(testFoo,“getFooID”);
IsTrue(fooID是Guid);
}

您无法控制获取新id,因此无法确认。但是,您可以在您控制的服务后面抽象id的创建,然后可以在测试中进行模拟和验证?我猜您可以使用
RetrieveNovel(novelid)
来实现这一点。单元测试应该真正模拟任何外部依赖项,例如
UriFactory.GetFooRoute
。然后,您将能够检查是否使用适当的参数调用了mock。还应模拟
RetrieveNovel
。通过这种方式,您可以编写测试来检查所有副作用。您无法控制获取新id,因此您无法确认这一点。但是,您可以在您控制的服务后面抽象id的创建,然后可以在测试中进行模拟和验证?我猜您可以使用
RetrieveNovel(novelid)
来实现这一点。单元测试应该真正模拟任何外部依赖项,例如
UriFactory.GetFooRoute
。然后,您将能够检查是否使用适当的参数调用了mock。还应模拟
RetrieveNovel
。通过这种方式,您还可以编写测试来检查所有副作用