模拟方法调用返回null

问题描述 投票:-1回答:1

我有以下清除不完整地址的方法。例如:说出AddressLine1 =“ 800 Wash s st”,然后返回“ 800 Washington s st”。对于这种方法,我通过AddressScrubbingApi使用了ApiClientHelper。因此,在当前代码中,我具有ApiClientHelper的依赖项。

public async Task<PartyAddress> ScrubAddress(PartyAddress addressToBeScrubbed)
{
if (_baseApiClient == null)
{
 SetApiClient(new BaseApiClient());
}
AddressScrubbingRequest addressObject = BuildRequestObject(addressToBeScrubbed);
string path = "/v1/addresses/actions/scrub";
//this is the baseApiClient that is to be injected as mock in unit test
var scrubbedAddress = await _baseApiClient.CallPostApiAsync<AddressScrubbingResponse>(AddressScrubbingApiKey, path, addressObject);
    if (scrubbedAddress.Status == ValidationStatus.HighProbabilityMatch.ToString())
     {
      addressToBeScrubbed.Addr1 = scrubbedAddress.Primary;
      addressToBeScrubbed.Addr2 = scrubbedAddress.Secondary;        
      addressToBeScrubbed.StreetNumber = scrubbedAddress.HouseNumber;
      addressToBeScrubbed.City = scrubbedAddress.City;
      addressToBeScrubbed.StateProv = StateCode.GetId(scrubbedAddress.State).HasValue ? AcordConversionHelper.CreateCodeValue(scrubbedAddress.State, StateCode.GetId(scrubbedAddress.State)) : AcordConversionHelper.CreateCodeValue(null, null);
      addressToBeScrubbed.PostalCode = scrubbedAddress.Zip5;
      addressToBeScrubbed.ZipExtension = scrubbedAddress.Zip4;
      addressToBeScrubbed.StreetName = scrubbedAddress.Name;
     //some more fields here
     addressToBeScrubbed.SuccessfullyScrubbedDtTm = System.DateTime.Now;
     }
     else if (scrubbedAddress.Status == ValidationStatus.MultipleMatches.ToString() || scrubbedAddress.Status == ValidationStatus.LowProbabilityMatch.ToString())
     {
      addressToBeScrubbed.StreetName = scrubbedAddress.Name;
      //partyAddress.Address.StreetType = scrubbedAddress.StreetTypeDesignator;
      //PreDirection=scrubbedAddress.PreDirection;
      //PostDirection=scrubbedAddress.PostDirection;
      addressToBeScrubbed.SuccessfullyScrubbedDtTm = System.DateTime.Now;
      }
   return addressToBeScrubbed;
}

这是到目前为止我尝试过的单元测试

public static async Task ConvertFromAcordScrubAddressTest()
{
TestHelper.InitializeAcordConversionMetadata();
ConvertFromAcord.PartyConversion partyConversion = new ConvertFromAcord.PartyConversion();
Address address = TestHelper.SetupPartyAddress();
var requestAddress = TestHelper.SetupRequestAddress(address);
var mock = new Mock<IBaseApiClient>();
partyConversion.SetApiClient(mock.Object);
string path = "/v1/addresses/actions/scrub";
mock.Setup(m => m.CallPostApiAsync<AddressScrubbingResponse>(AddressScrubbingApiKey, path, requestAddress))
                .ReturnsAsync(new AddressScrubbingResponse
                {
                    Status = "MultipleMatches",
                    Message = "Multiple matches were found for the address you entered.  Normally this is a result of not including East, West, North, or South in the address line.",
                    IsPhysicalMatch = false,
                    Primary = "800 N WASHINGTON ST",
                    Secondary = string.Empty,
                    City = "VAN WERT",
                    State = "OH",
                    Zip5 = "45891",
                    Zip4 = "1269",
                    HouseNumber = "800",
                    PostDirection = string.Empty,
                    Name = "Washington",
                    StreetTypeDesignator = "St",
                    PreDirection = "N",
                    PoBoxNumber = string.Empty,
                    UnitTypeDesignator = string.Empty,
                    UnitNumber = string.Empty,
                    PrivateMailBox = string.Empty
                });
var scrubbedAddress=await  partyConversion.ScrubAddress(address);

 // Assert.PropertyChanged(address, nameof(address.Addr1), t=>t.partyConversion.ScrubAddress(address));
// this is to test whether Addr1 property is set when a call to the partyConversion.ScrubAddress(address); is made in above.
}

我的问题如下

  1. 当我的模拟通过时,在partyConversion.ScrubAddress()方法中,它返回null。因此,这之后的行将引发Object reference null异常。我以错误的方式创建了模拟吗?
  2. 如何测试此方法来检查属性更改?
c# unit-testing xunit.net
1个回答
0
投票

似乎传递的模拟requestAddress不是通过代码AddressScrubbingRequest addressObject = BuildRequestObject(addressToBeScrubbed);创建的addressObject equal

在这种情况下,您可以在It.IsAny<AddressScrubbingRequest>()期间将最后一个参数定义为Setup,将调用您的模拟方法。

mock.Setup(m => m.CallPostApiAsync<AddressScrubbingResponse>
                 (AddressScrubbingApiKey, path, It.IsAny<AddressScrubbingRequest>()))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.