Search code examples
c#tddmstestassert

TDD - Why does this Assert.AreSame pass?


I have a test method...

[TestMethod]
public void MainViewModel_PropertiesReflectDataEntityProperties()
{
    // Arrange
    var facilityDataEntity = MockRepository.GenerateStub<FacilityDataEntity>();
    var shopOrderDataEntity = MockRepository.GenerateStub<ShopOrderDataEntity>();

    // Act
    MainViewModel mainViewModel = new MainViewModel(facilityDataEntity, shopOrderDataEntity);

    // Assert
    Assert.AreSame(facilityDataEntity.Value, mainViewModel.FacilityValue);
}

... and the test passes. However, I have not implemented the mapping of the DataEntity's properties to the MainViewModel's properties yet! How can this be? I thought AreSame checks whether two references point to the same instance.

public class MainViewModel
{
    private readonly FacilityDataEntity facilityDataEntity;
    private readonly ShopOrderDataEntity shopOrderDataEntity;

    public MainViewModel(FacilityDataEntity facilityDataEntity)
    {
        this.facilityDataEntity = facilityDataEntity;
    }

    public MainViewModel(FacilityDataEntity facilityDataEntity, ShopOrderDataEntity shopOrderDataEntity)
    {
        this.facilityDataEntity = facilityDataEntity;
        this.shopOrderDataEntity = shopOrderDataEntity;
    }

    public ShopOrderDataEntity ShopOrderDataEntity
    {
        get { return shopOrderDataEntity; }
    }

    public FacilityDataEntity FacilityDataEntity
    {
        get { return facilityDataEntity; }
    } 

    public int ShopOrder { get; set; }

    public decimal RequiredQuantity { get; set; }

    public string ItemCode { get; set; }

    public string ItemDescription { get; set; }

    public string FacilityValue { get; set; }

    public string FacilityLabel { get; set; }

    public static IEnumerable<MainViewModel> TranslateDataEntityList(IEnumerable<FacilityDataEntity> facilityDataEntityList)
    {
        foreach (FacilityDataEntity facilityDataEntity in facilityDataEntityList)
        {
            yield return new MainViewModel(facilityDataEntity);
        }
    }

    public static IEnumerable<MainViewModel> TranslateDataEntityList(FacilityDataEntity facilityDataEntity, IEnumerable<ShopOrderDataEntity> shopOrderDataEntityList)
    {
        foreach (ShopOrderDataEntity shopOrderDataEntity in shopOrderDataEntityList)
        {
            yield return new MainViewModel(facilityDataEntity, shopOrderDataEntity);
        }
    }
}

Solution

  • Underneath it all, these tests are just using Object.ReferenceEquals:

    true if objA is the same instance as objB or if both are null; otherwise, false.